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
			| 
											3 years ago
										 | 
 | ||
|  | /** | ||
|  |  * 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; | ||
|  | }; |