Bug #16127 » delegate-basicobject.patch
| lib/delegate.rb | ||
|---|---|---|
|
r = true
|
||
|
target = self.__getobj__ {r = false}
|
||
|
if r && target.respond_to?(m)
|
||
|
if r && target_respond_to?(target, m, false)
|
||
|
target.__send__(m, *args, &block)
|
||
|
elsif ::Kernel.method_defined?(m) || ::Kernel.private_method_defined?(m)
|
||
|
::Kernel.instance_method(m).bind(self).(*args, &block)
|
||
| ... | ... | |
|
def respond_to_missing?(m, include_private)
|
||
|
r = true
|
||
|
target = self.__getobj__ {r = false}
|
||
|
r &&= target.respond_to?(m, include_private)
|
||
|
if r && include_private && !target.respond_to?(m, false)
|
||
|
r &&= target_respond_to?(target, m, include_private)
|
||
|
if r && include_private && !target_respond_to?(target, m, false)
|
||
|
warn "delegator does not forward private method \##{m}", uplevel: 3
|
||
|
return false
|
||
|
end
|
||
|
r
|
||
|
end
|
||
|
# Handle BasicObject instances
|
||
|
private def target_respond_to?(target, m, include_private)
|
||
|
case target
|
||
|
when Object
|
||
|
target.respond_to?(m, include_private)
|
||
|
else
|
||
|
::Kernel.instance_method(:respond_to?).bind(target).(m, include_private)
|
||
|
end
|
||
|
end
|
||
|
#
|
||
|
# Returns the methods available to this delegate object as the union
|
||
|
# of this object's and \_\_getobj\_\_ methods.
|
||
| test/test_delegate.rb | ||
|---|---|---|
|
delegate.constants
|
||
|
end
|
||
|
end
|
||
|
def test_basicobject
|
||
|
delegate = SimpleDelegator.new(BasicObject.new)
|
||
|
assert_raise(NoMethodError, /undefined method `foo' for/) { delegate.foo }
|
||
|
end
|
||
|
end
|
||