You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							122 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							122 lines
						
					
					
						
							2.0 KiB
						
					
					
				| 
 | |
| /**
 | |
|  * Expose `Delegator`.
 | |
|  */
 | |
| 
 | |
| module.exports = Delegator;
 | |
| 
 | |
| /**
 | |
|  * Initialize a delegator.
 | |
|  *
 | |
|  * @param {Object} proto
 | |
|  * @param {String} target
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| function Delegator(proto, target) {
 | |
|   if (!(this instanceof Delegator)) return new Delegator(proto, target);
 | |
|   this.proto = proto;
 | |
|   this.target = target;
 | |
|   this.methods = [];
 | |
|   this.getters = [];
 | |
|   this.setters = [];
 | |
|   this.fluents = [];
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * Delegate method `name`.
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @return {Delegator} self
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Delegator.prototype.method = function(name){
 | |
|   var proto = this.proto;
 | |
|   var target = this.target;
 | |
|   this.methods.push(name);
 | |
| 
 | |
|   proto[name] = function(){
 | |
|     return this[target][name].apply(this[target], arguments);
 | |
|   };
 | |
| 
 | |
|   return this;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Delegator accessor `name`.
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @return {Delegator} self
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Delegator.prototype.access = function(name){
 | |
|   return this.getter(name).setter(name);
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Delegator getter `name`.
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @return {Delegator} self
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Delegator.prototype.getter = function(name){
 | |
|   var proto = this.proto;
 | |
|   var target = this.target;
 | |
|   this.getters.push(name);
 | |
| 
 | |
|   proto.__defineGetter__(name, function(){
 | |
|     return this[target][name];
 | |
|   });
 | |
| 
 | |
|   return this;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Delegator setter `name`.
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @return {Delegator} self
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Delegator.prototype.setter = function(name){
 | |
|   var proto = this.proto;
 | |
|   var target = this.target;
 | |
|   this.setters.push(name);
 | |
| 
 | |
|   proto.__defineSetter__(name, function(val){
 | |
|     return this[target][name] = val;
 | |
|   });
 | |
| 
 | |
|   return this;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Delegator fluent accessor
 | |
|  *
 | |
|  * @param {String} name
 | |
|  * @return {Delegator} self
 | |
|  * @api public
 | |
|  */
 | |
| 
 | |
| Delegator.prototype.fluent = function (name) {
 | |
|   var proto = this.proto;
 | |
|   var target = this.target;
 | |
|   this.fluents.push(name);
 | |
| 
 | |
|   proto[name] = function(val){
 | |
|     if ('undefined' != typeof val) {
 | |
|       this[target][name] = val;
 | |
|       return this;
 | |
|     } else {
 | |
|       return this[target][name];
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   return this;
 | |
| };
 |