зеркало из https://github.com/github/ruby.git
* lib/delegate: Delegator: combine (public|protected) methods with
those of the delegated object. [ruby-core:27224] DelegateClass: combine (public|protected) instance methods with those of the delegated superclass. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28099 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
Родитель
1d06ff9761
Коммит
89efbfe0fa
|
@ -1,3 +1,10 @@
|
|||
Mon May 31 01:43:42 2010 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
||||
|
||||
* lib/delegate: Delegator: combine (public|protected) methods with
|
||||
those of the delegated object. [ruby-core:27224]
|
||||
DelegateClass: combine (public|protected) instance methods
|
||||
with those of the delegated superclass.
|
||||
|
||||
Sun May 30 22:18:49 2010 Marc-Andre Lafortune <ruby-core@marc-andre.ca>
|
||||
|
||||
* lib/set.rb (keep_if, select!): New methods [ruby-core:29749]
|
||||
|
|
|
@ -160,6 +160,32 @@ class Delegator < BasicObject
|
|||
r
|
||||
end
|
||||
|
||||
#
|
||||
# Returns the methods available to this delegate object as the union
|
||||
# of this object's and \_\_getobj\_\_ methods.
|
||||
#
|
||||
def methods
|
||||
__getobj__.methods | super
|
||||
end
|
||||
|
||||
#
|
||||
# Returns the methods available to this delegate object as the union
|
||||
# of this object's and \_\_getobj\_\_ public methods.
|
||||
#
|
||||
def public_methods(all=true)
|
||||
__getobj__.public_methods(all) | super
|
||||
end
|
||||
|
||||
#
|
||||
# Returns the methods available to this delegate object as the union
|
||||
# of this object's and \_\_getobj\_\_ protected methods.
|
||||
#
|
||||
def protected_methods(all=true)
|
||||
__getobj__.protected_methods(all) | super
|
||||
end
|
||||
|
||||
# Note: no need to specialize private_methods, since they are not forwarded
|
||||
|
||||
#
|
||||
# Returns true if two objects are considered same.
|
||||
#
|
||||
|
@ -281,10 +307,10 @@ end
|
|||
#
|
||||
def DelegateClass(superclass)
|
||||
klass = Class.new(Delegator)
|
||||
methods = superclass.public_instance_methods(true)
|
||||
methods = superclass.instance_methods
|
||||
methods -= ::Delegator.public_api
|
||||
methods -= [:to_s,:inspect,:=~,:!~,:===]
|
||||
klass.module_eval {
|
||||
klass.module_eval do
|
||||
def __getobj__ # :nodoc:
|
||||
@delegate_dc_obj
|
||||
end
|
||||
|
@ -292,12 +318,16 @@ def DelegateClass(superclass)
|
|||
raise ArgumentError, "cannot delegate to self" if self.equal?(obj)
|
||||
@delegate_dc_obj = obj
|
||||
end
|
||||
}
|
||||
klass.module_eval do
|
||||
methods.each do |method|
|
||||
define_method(method, Delegator.delegating_block(method))
|
||||
end
|
||||
end
|
||||
klass.define_singleton_method :public_instance_methods do |all=true|
|
||||
super(all) - superclass.protected_instance_methods
|
||||
end
|
||||
klass.define_singleton_method :protected_instance_methods do |all=true|
|
||||
super(all) | superclass.protected_instance_methods
|
||||
end
|
||||
return klass
|
||||
end
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче