mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* lib/delegate.rb (Delegator::public_api): take snapshot of
public method at the beginning time. * lib/delegate.rb (SimpleDelegator#initialize): use Delegator.public_api since public_method might be added after initialization. [ruby-dev:39383] * lib/delegate.rb (DelegateClass): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@25245 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
1c544fccd2
commit
e1797bc7dd
3 changed files with 50 additions and 1 deletions
11
ChangeLog
11
ChangeLog
|
@ -17,6 +17,17 @@ Tue Oct 6 06:26:00 2009 Hidetoshi NAGAI <nagai@ai.kyutech.ac.jp>
|
|||
* ext/tk/lib/tk/canvas.rb, ext/tk/lib/tkextlib/blt/component.rb:
|
||||
lack of support for methodcall_optkeys.
|
||||
|
||||
Mon Oct 5 17:19:33 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* lib/delegate.rb (Delegator::public_api): take snapshot of
|
||||
public method at the beginning time.
|
||||
|
||||
* lib/delegate.rb (SimpleDelegator#initialize): use
|
||||
Delegator.public_api since public_method might be added after
|
||||
initialization. [ruby-dev:39383]
|
||||
|
||||
* lib/delegate.rb (DelegateClass): ditto.
|
||||
|
||||
Mon Oct 5 12:22:12 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
|
||||
|
||||
* array.c (rb_ary_{times, shuffle_bang, sample}): reducing macro
|
||||
|
|
|
@ -196,6 +196,11 @@ class Delegator
|
|||
new.__setobj__(__getobj__.dup)
|
||||
new
|
||||
end
|
||||
|
||||
@delegator_api = self.public_instance_methods
|
||||
def self.public_api # :nodoc:
|
||||
@delegator_api
|
||||
end
|
||||
end
|
||||
|
||||
#
|
||||
|
@ -228,6 +233,17 @@ class SimpleDelegator<Delegator
|
|||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||
@delegate_sd_obj = obj
|
||||
end
|
||||
|
||||
def initialize(obj) # :nodoc:
|
||||
(self.public_methods - Delegator.public_api).each do |m|
|
||||
class << self
|
||||
self
|
||||
end.class_eval do
|
||||
undef_method m
|
||||
end
|
||||
end
|
||||
super
|
||||
end
|
||||
end
|
||||
|
||||
# :stopdoc:
|
||||
|
@ -257,7 +273,7 @@ end
|
|||
def DelegateClass(superclass)
|
||||
klass = Class.new(Delegator)
|
||||
methods = superclass.public_instance_methods(true)
|
||||
methods -= ::Delegator.public_instance_methods
|
||||
methods -= ::Delegator.public_api
|
||||
methods -= [:to_s,:inspect,:=~,:!~,:===]
|
||||
klass.module_eval {
|
||||
def __getobj__ # :nodoc:
|
||||
|
|
|
@ -29,4 +29,26 @@ class TestDelegateClass < Test::Unit::TestCase
|
|||
simple=SimpleDelegator.new([])
|
||||
assert_equal(SimpleDelegator,simple.class)
|
||||
end
|
||||
|
||||
class Object
|
||||
def m
|
||||
:o
|
||||
end
|
||||
end
|
||||
|
||||
class Foo
|
||||
def m
|
||||
:m
|
||||
end
|
||||
end
|
||||
|
||||
class Bar < DelegateClass(Foo)
|
||||
end
|
||||
|
||||
def test_override
|
||||
assert_equal(:o, Object.new.m)
|
||||
assert_equal(:m, Foo.new.m)
|
||||
assert_equal(:m, SimpleDelegator.new(Foo.new).m)
|
||||
assert_equal(:m, Bar.new(Foo.new).m)
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in a new issue