From: michaud.sonny@... Date: 2018-01-04T03:25:12+00:00 Subject: [ruby-core:84624] [Ruby trunk Bug#14252] Refined Method Visibility Lost with Dynamic Dispatch and Reflection Issue #14252 has been updated by sonnym (Sonny Michaud). I wrote an article explaining what I was trying to accomplish when I encountered this behavior, in case that helps elucidate my motivations: https://sonnym.github.io/2018/01/03/privacy-and-exposure-gatekeeprs-and-privileged-consumers/ ---------------------------------------- Bug #14252: Refined Method Visibility Lost with Dynamic Dispatch and Reflection https://bugs.ruby-lang.org/issues/14252#change-69168 * 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: