Class | Delegator |
In: |
lib/delegate.rb
|
Parent: | Object |
Delegator is an abstract class used to build delegator pattern objects from subclasses. Subclasses should redefine __getobj__. For a concrete implementation, see SimpleDelegator.
IgnoreBacktracePat | = | %r"\A#{Regexp.quote(__FILE__)}:\d+:in `" |
initialize | -> | initialize_methods |
Pass in the obj to delegate method calls to. All methods supported by obj will be delegated to.
# File lib/delegate.rb, line 124 124: def initialize(obj) 125: preserved = ::Kernel.public_instance_methods(false) 126: preserved -= ["to_s","to_a","inspect","==","=~","==="] 127: for t in self.class.ancestors 128: preserved |= t.public_instance_methods(false) 129: preserved |= t.private_instance_methods(false) 130: preserved |= t.protected_instance_methods(false) 131: break if t == Delegator 132: end 133: preserved << "singleton_method_added" 134: for method in obj.methods 135: next if preserved.include? method 136: begin 137: eval "def self.\#{method}(*args, &block)\nbegin\n__getobj__.__send__(:\#{method}, *args, &block)\nensure\n$@.delete_if{|s|IgnoreBacktracePat=~s} if $@\nend\nend\n", nil, __FILE__, __LINE__+1 138: rescue SyntaxError 139: raise NameError, "invalid identifier %s" % method, caller(4) 140: end 141: end 142: end
This method must be overridden by subclasses and should return the object method calls are being delegated to.
# File lib/delegate.rb, line 176 176: def __getobj__ 177: raise NotImplementedError, "need to define `__getobj__'" 178: end
Serialization support for the object returned by __getobj__.
# File lib/delegate.rb, line 181 181: def marshal_dump 182: __getobj__ 183: end
Reinitializes delegation from a serialized object.
# File lib/delegate.rb, line 185 185: def marshal_load(obj) 186: initialize_methods(obj) 187: __setobj__(obj) 188: end
Handles the magic of delegation through __getobj__.
# File lib/delegate.rb, line 155 155: def method_missing(m, *args) 156: target = self.__getobj__ 157: unless target.respond_to?(m) 158: super(m, *args) 159: end 160: target.__send__(m, *args) 161: end