diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | lib/delegate.rb | 13 | ||||
-rw-r--r-- | test/test_delegate.rb | 9 |
3 files changed, 26 insertions, 1 deletions
@@ -1,3 +1,8 @@ +Wed Nov 20 01:27:33 2013 Nobuyoshi Nakada <[email protected]> + + * lib/delegate.rb (Delegator#send): separate from method_missing so + that super calls proper method. + Tue Nov 19 23:38:49 2013 Nobuyoshi Nakada <[email protected]> * configure.in (--with-os-version-style): option to transform target diff --git a/lib/delegate.rb b/lib/delegate.rb index 74b13aa8a3..b929895d1f 100644 --- a/lib/delegate.rb +++ b/lib/delegate.rb @@ -74,7 +74,18 @@ class Delegator < BasicObject [email protected]_if {|t| %r"\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:"o =~ t} if $@ end end - alias send method_missing + + # + # Handles the magic of delegation through \_\_getobj\_\_. + # + def send(m, *args, &block) + target = self.__getobj__ + begin + target.respond_to?(m) ? target.__send__(m, *args, &block) : super(m, *args, &block) + ensure + [email protected]_if {|t| %r"\A#{Regexp.quote(__FILE__)}:#{__LINE__-2}:"o =~ t} if $@ + end + end # # Checks for a method provided by this the delegate object by forwarding the diff --git a/test/test_delegate.rb b/test/test_delegate.rb index d816a62bf5..6448ef90dd 100644 --- a/test/test_delegate.rb +++ b/test/test_delegate.rb @@ -145,4 +145,13 @@ class TestDelegateClass < Test::Unit::TestCase assert_nothing_raised(ArgumentError) {d.open} assert_nothing_raised(ArgumentError) {d.send(:open)} end + + def test_send_method_in_delegator + d = Class.new(SimpleDelegator) do + def foo + "foo" + end + end.new(Object.new) + assert_equal("foo", d.send(:foo)) + end end |