Delegator is an abstract class used to build delegator pattern objects from subclasses. Subclasses should redefine _getobj_. For a concrete implementation, see SimpleDelegator.
Pass in the obj to delegate method calls to. All methods supported by obj will be delegated to.
# File delegate.rb, line 123
def initialize(obj)
preserved = ::Kernel.public_instance_methods(false)
preserved -= ["to_s","to_a","inspect","==","=~","==="]
for t in self.class.ancestors
preserved |= t.public_instance_methods(false)
preserved |= t.private_instance_methods(false)
preserved |= t.protected_instance_methods(false)
break if t == Delegator
end
preserved << "singleton_method_added"
for method in obj.methods
next if preserved.include? method
begin
eval <<-EOS
def self.#{method}(*args, &block)
begin
__getobj__.__send__(:#{method}, *args, &block)
rescue Exception
$@.delete_if{|s| /:in `__getobj__'$/ =~ s} #`
$@.delete_if{|s| /^\\(eval\\):/ =~ s}
Kernel::raise
end
end
EOS
rescue SyntaxError
raise NameError, "invalid identifier %s" % method, caller(4)
end
end
end
This method must be overridden by subclasses and should return the object method calls are being delegated to.
# File delegate.rb, line 176
def __getobj__
raise NotImplementedError, "need to define `__getobj__'"
end
Serialization support for the object returned by _getobj_.
# File delegate.rb, line 181
def marshal_dump
__getobj__
end
Reinitializes delegation from a serialized object.
# File delegate.rb, line 185
def marshal_load(obj)
initialize_methods(obj)
__setobj__(obj)
end
Handles the magic of delegation through _getobj_.
# File delegate.rb, line 155
def method_missing(m, *args, &block)
target = self.__getobj__
unless target.respond_to?(m)
super(m, *args, &block)
end
target.__send__(m, *args, &block)
end
Checks for a method provided by this the delegate object by fowarding the call through _getobj_.
# File delegate.rb, line 167
def respond_to?(m, include_private = false)
return true if super
return self.__getobj__.respond_to?(m, include_private)
end