Blame view

node_modules/delegates/index.js 2.02 KB
aaac7fed   liuqimichale   add
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
  
  /**
   * 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;
  };