diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-12-16 07:30:36 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1998-12-16 07:30:36 +0000 |
commit | e299d511db939232c628d6880e61c32e83937d66 (patch) | |
tree | a2083bfd64a4fb3ed7454a7e7062ff9f7fa1232e /lib/delegate.rb | |
parent | ce8859c5563493a94f57d3b630e7b9c1d3cd656f (diff) |
first public release of 1.1d (pre1.2) series
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/v1_1dev@354 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/delegate.rb')
-rw-r--r-- | lib/delegate.rb | 50 |
1 files changed, 30 insertions, 20 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb index d784586702..594c500cab 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -20,24 +20,32 @@ class Delegator def initialize(obj) preserved = ::Kernel.instance_methods + preserved -= ["to_s","to_a","inspect","==","=~","==="] for t in self.type.ancestors preserved |= t.instance_methods + preserved |= t.private_instance_methods + preserved |= t.protected_instance_methods break if t == Delegator end - preserved -= ["to_s","to_a","inspect","==","=~","==="] for method in obj.methods next if preserved.include? method - eval <<EOS -def self.#{method}(*args, &block) - begin - __getobj__.__send__(:#{method}, *args, &block) - rescue Exception - n = if /:in `__getobj__'$/ =~ $@[0] then 1 else 2 end #` - $@[1,n] = nil - raise - end -end -EOS + eval <<-EOS + def self.#{method}(*args, &block) + begin + __getobj__.__send__(:#{method}, *args, &block) + rescue Exception + c = -caller(0).size + if /:in `__getobj__'$/ =~ $@[c-1] #` + n = 1 + else + c -= 1 + n = 2 + end + $@[c,n] = nil + raise + end + end + EOS end end @@ -72,14 +80,14 @@ def DelegateClass(superclass) klass = Class.new methods = superclass.instance_methods methods -= ::Kernel.instance_methods - methods |= ["to_s","to_a","inspect","hash","eql?","==","=~","==="] - klass.module_eval <<EOS + methods |= ["to_s","to_a","inspect","==","=~","==="] + klass.module_eval <<-EOS def initialize(obj) @obj = obj end -EOS + EOS for method in methods - klass.module_eval <<EOS + klass.module_eval <<-EOS def #{method}(*args, &block) begin @obj.__send__(:#{method}, *args, &block) @@ -88,7 +96,7 @@ EOS raise end end -EOS + EOS end return klass; end @@ -107,10 +115,12 @@ if __FILE__ == $0 foo = Object.new def foo.test + 25 + end + def foo.error raise 'this is OK' end foo2 = SimpleDelegator.new(foo) - p foo.hash == foo2.hash # => true - foo.test # raise error! - + p foo.test == foo2.test # => true + foo2.error # raise error! end |