Issue #14252 has been reported by sonnym (Sonny Michaud).

----------------------------------------
Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection
https://bugs.ruby-lang.org/issues/14252

* Author: sonnym (Sonny Michaud)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: ruby 2.5.0p0 (2017-12-25 revision 61468) [x86_64-linux]
* Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN
----------------------------------------
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.

~~~ ruby
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.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>