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