summaryrefslogtreecommitdiff
path: root/lib/delegate.rb
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-17 07:18:29 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2004-05-17 07:18:29 +0000
commitdcae18de822625d020e4ce42d9a2b4673e9386ea (patch)
tree17c7acdee90e2a54422c29460db7ac72be93b07c /lib/delegate.rb
parent36b02b16a134f67091ce238e6ac2eb0968a643a9 (diff)
* ext/socket/socket.c (setup_domain_and_type): honor duck typing.
[ruby-dev:23522] * ext/socket/socket.c (sock_s_getnameinfo): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@6347 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/delegate.rb')
-rw-r--r--lib/delegate.rb26
1 files changed, 18 insertions, 8 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb
index 3bbd148e74..122a565642 100644
--- a/lib/delegate.rb
+++ b/lib/delegate.rb
@@ -87,14 +87,24 @@ def DelegateClass(superclass)
methods = superclass.public_instance_methods(true)
methods -= ::Kernel.public_instance_methods(false)
methods |= ["to_s","to_a","inspect","==","=~","==="]
- klass.module_eval <<-EOS
- def initialize(obj)
- @_dc_obj = obj
- end
- def __getobj__
- @_dc_obj
- end
- EOS
+ klass.module_eval {
+ def initialize(obj)
+ @_dc_obj = obj
+ end
+ def method_missing(m, *args)
+ p [m, *args]
+ unless @_dc_obj.respond_to?(m)
+ super(m, *args)
+ end
+ @_dc_obj.__send__(m, *args)
+ end
+ def __getobj__
+ @_dc_obj
+ end
+ def __setobj__(obj)
+ @_dc_obj = obj
+ end
+ }
for method in methods
begin
klass.module_eval <<-EOS