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)
@_dc_obj = obj
end
def method_missing(m, *args)
unless @_dc_obj.respond_to?(m)
super(m, *args)
end
@_dc_obj.__send__(m, *args)
end
def respond_to?(m)
return true if super
return @_dc_obj.respond_to?(m)
end
def __getobj__
@_dc_obj
end
def __setobj__(obj)
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
@_dc_obj = obj
end
def clone
super
__setobj__(__getobj__.clone)
end
def dup
super
__setobj__(__getobj__.dup)
end
}
for method in methods
begin
klass.module_eval "def \#{method}(*args, &block)\nbegin\n@_dc_obj.__send__(:\#{method}, *args, &block)\nrescue\n$@[0,2] = nil\nraise\nend\nend\n"
rescue SyntaxError
raise NameError, "invalid identifier %s" % method, caller(3)
end
end
return klass
end