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