BasicObject
The primary interface to this library. Use to setup delegation when defining your class.
class MyClass < DelegateClass( ClassToDelegateTo ) # Step 1 def initiaize super(obj_of_ClassToDelegateTo) # Step 2 end end
# File delegate.rb, line 259 def DelegateClass(superclass) klass = Class.new methods = superclass.public_instance_methods(true) methods -= ::Kernel.public_instance_methods(false) methods |= ["to_s","to_a","inspect","==","=~","==="] klass.module_eval { def initialize(obj) # :nodoc: @_dc_obj = obj end def method_missing(m, *args, &block) # :nodoc: unless @_dc_obj.respond_to?(m) super(m, *args, &block) end @_dc_obj.__send__(m, *args, &block) end def respond_to?(m, include_private = false) # :nodoc: return true if super return @_dc_obj.respond_to?(m, include_private) end def __getobj__ # :nodoc: @_dc_obj end def __setobj__(obj) # :nodoc: raise ArgumentError, "cannot delegate to self" if self.equal?(obj) @_dc_obj = obj end def clone # :nodoc: new = super new.__setobj__(__getobj__.clone) new end def dup # :nodoc: new = super new.__setobj__(__getobj__.clone) new end } for method in methods begin klass.module_eval <<-EOS def #{method}(*args, &block) begin @_dc_obj.__send__(:#{method}, *args, &block) rescue $@[0,2] = nil raise end end EOS rescue SyntaxError raise NameError, "invalid identifier %s" % method, caller(3) end end return klass end