diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-12 07:17:36 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2005-08-12 07:17:36 +0000 |
commit | ec14c2c9b925f6add71f7f4d25e0a281f8adb252 (patch) | |
tree | 1c18cec4b2c748514ac3b705b2e68feeb122337e /lib/delegate.rb | |
parent | d3de1ac85bca8d512d2d7ca152dd3aced2fc8867 (diff) |
* numeric.c (fix_equal, fix_cmp, fix_gt, fix_ge, fix_lt, fix_le):
reduce coercing when a method knows about a operand type.
[ruby-dev:26789]
* lib/delegate.rb: simplifies Delegator classes; SimpleDelegator
now uses method_missing for all methods.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@8970 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/delegate.rb')
-rw-r--r-- | lib/delegate.rb | 76 |
1 files changed, 31 insertions, 45 deletions
diff --git a/lib/delegate.rb b/lib/delegate.rb index 1d0ebed07a..83aaf292a5 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -17,44 +17,27 @@ # end class Delegator + preserved = ["__id__", "object_id", "__send__", "respond_to?"] + instance_methods.each do |m| + next if preserved.include?(m) + undef_method m + end def initialize(obj) - preserved = ::Kernel.public_instance_methods(false) - preserved -= ["to_s","to_a","inspect","==","=~","==="] - for t in self.class.ancestors - preserved |= t.public_instance_methods(false) - preserved |= t.private_instance_methods(false) - preserved |= t.protected_instance_methods(false) - break if t == Delegator - end - preserved << "singleton_method_added" - for method in obj.methods - next if preserved.include? method - begin - eval <<-EOS - def self.#{method}(*args, &block) - begin - __getobj__.__send__(:#{method}, *args, &block) - rescue Exception - [email protected]_if{|s| /:in `__getobj__'$/ =~ s} #` - [email protected]_if{|s| /^\\(eval\\):/ =~ s} - ::Kernel::raise - end - end - EOS - rescue SyntaxError - raise NameError, "invalid identifier %s" % method, caller(4) - end - end + __setobj__(obj) end - alias initialize_methods initialize def method_missing(m, *args) - target = self.__getobj__ - unless target.respond_to?(m) - super(m, *args) + begin + target = self.__getobj__ + unless target.respond_to?(m) + super(m, *args) + end + target.__send__(m, *args) + rescue Exception + [email protected]_if{|s| /^#{__FILE__}:\d+:in `method_missing'$/ =~ s} #` + ::Kernel::raise end - target.__send__(m, *args) end def respond_to?(m) @@ -66,21 +49,19 @@ class Delegator raise NotImplementedError, "need to define `__getobj__'" end + def __setobj__(obj) + raise NotImplementedError, "need to define `__setobj__'" + end + def marshal_dump __getobj__ end def marshal_load(obj) - initialize_methods(obj) + __setobj__(obj) end end class SimpleDelegator<Delegator - - def initialize(obj) - super - @_sd_obj = obj - end - def __getobj__ @_sd_obj end @@ -91,12 +72,14 @@ class SimpleDelegator<Delegator end def clone - super - __setobj__(__getobj__.clone) + copy = super + copy.__setobj__(__getobj__.clone) + copy end def dup - super - __setobj__(__getobj__.dup) + copy = super + copy.__setobj__(__getobj__.dup) + copy end end @@ -108,8 +91,11 @@ SimpleDelegater = SimpleDelegator def DelegateClass(superclass) klass = Class.new methods = superclass.public_instance_methods(true) - methods -= ::Kernel.public_instance_methods(false) - methods |= ["to_s","to_a","inspect","==","=~","==="] + methods -= [ + "__id__", "object_id", "__send__", "respond_to?", + "initialize", "method_missing", "__getobj__", "__setobj__", + "clone", "dup", "marshal_dump", "marshal_load", + ] klass.module_eval { def initialize(obj) @_dc_obj = obj |