| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 | 
/** * 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;};
 |