Actions
Bug #14252
closedRefined Method Visibility Lost with Dynamic Dispatch and Reflection
Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
Description
Consider the following simple objects, one with a protected class method and another with a public class method calling on the protected method. This is accomplished using a refinement that marks the method as public on the singleton class of the original object.
class Protected
class << self
protected
def print
:protected
end
end
end
module Publicize
refine Protected.singleton_class do
public :print
end
end
class Public
using Publicize
def self.print
Protected.public_methods.include?(:print) # false
Protected.protected_methods.include?(:print) # true
Protected.print # works
Protected.public_send(:print) # fails
end
end
Public.print
This works perfectly well for the static Protected.print
call, but has a number of surprises when trying to do anything more advanced. Namely:
- Attempting to call the method with refined visibility raises a
NoMethodError
- The method appears in the
protected_methods
list of the original object - The method does not appear in the
public_methods
list of the original object
As a user, I would expect all those things to be not the case, since, if I opened the class directly and changed the visibility of the method, those three items would no longer be true.
Actions
Like0
Like0Like0Like0