Merge pull request #22071 from yui-knk/redefine_method_keep_visibility
Make `Module#redefine_method` to keep method visibility
This commit is contained in:
commit
6616cb866e
@ -16,7 +16,20 @@ def remove_possible_singleton_method(method)
|
|||||||
# Replaces the existing method definition, if there is one, with the passed
|
# Replaces the existing method definition, if there is one, with the passed
|
||||||
# block as its body.
|
# block as its body.
|
||||||
def redefine_method(method, &block)
|
def redefine_method(method, &block)
|
||||||
|
visibility = method_visibility(method)
|
||||||
remove_possible_method(method)
|
remove_possible_method(method)
|
||||||
define_method(method, &block)
|
define_method(method, &block)
|
||||||
|
send(visibility, method)
|
||||||
|
end
|
||||||
|
|
||||||
|
def method_visibility(method) # :nodoc:
|
||||||
|
case
|
||||||
|
when private_method_defined?(method)
|
||||||
|
:private
|
||||||
|
when protected_method_defined?(method)
|
||||||
|
:protected
|
||||||
|
else
|
||||||
|
:public
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -7,6 +7,16 @@ def do_something
|
|||||||
return 1
|
return 1
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def do_something_protected
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
protected :do_something_protected
|
||||||
|
|
||||||
|
def do_something_private
|
||||||
|
return 1
|
||||||
|
end
|
||||||
|
private :do_something_private
|
||||||
|
|
||||||
class << self
|
class << self
|
||||||
def do_something_else
|
def do_something_else
|
||||||
return 2
|
return 2
|
||||||
@ -34,8 +44,16 @@ def test_remove_singleton_method_from_an_object
|
|||||||
def test_redefine_method_in_an_object
|
def test_redefine_method_in_an_object
|
||||||
RemoveMethodTests::A.class_eval{
|
RemoveMethodTests::A.class_eval{
|
||||||
self.redefine_method(:do_something) { return 100 }
|
self.redefine_method(:do_something) { return 100 }
|
||||||
|
self.redefine_method(:do_something_protected) { return 100 }
|
||||||
|
self.redefine_method(:do_something_private) { return 100 }
|
||||||
}
|
}
|
||||||
assert_equal 100, RemoveMethodTests::A.new.do_something
|
assert_equal 100, RemoveMethodTests::A.new.do_something
|
||||||
|
assert_equal 100, RemoveMethodTests::A.new.send(:do_something_protected)
|
||||||
|
assert_equal 100, RemoveMethodTests::A.new.send(:do_something_private)
|
||||||
|
|
||||||
|
assert RemoveMethodTests::A.public_method_defined? :do_something
|
||||||
|
assert RemoveMethodTests::A.protected_method_defined? :do_something_protected
|
||||||
|
assert RemoveMethodTests::A.private_method_defined? :do_something_private
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
Loading…
Reference in New Issue
Block a user