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.
		
		
		
		
		
			
		
			
				
					
					
						
							121 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							121 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; | 
						|
};
 | 
						|
 |