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;
 | 
						|
};
 |