Project

General

Profile

Misc #14825

When redefining `attr_xx` methods the visibility becomes `public`

Added by y-yagi (Yuji Yaginuma) 2 months ago.

Status:
Open
Priority:
Normal
Assignee:
-
[ruby-core:87406]

Description

Hi.

If redefine attr_xx methods, the original visibility is lost and all visibility is public.

# attr.rb
module ClassMethods
  def attr_reader(*)
    super
  end

  def attr_writer(*)
    super
  end

  def attr_accessor(*)
    super
  end
end

class Foo
  extend ClassMethods

  class << self
    def method_visibility(method)
      case
      when private_method_defined?(method)
        :private
      when protected_method_defined?(method)
        :protected
      else
        :public
      end
    end
  end

  attr_reader :pub

  protected

  attr_reader :prot
  alias protalias prot
  alias_method :protaliasmethod, :prot

  private

  attr_reader :priv
  alias privalias priv
  alias_method :privaliasmethod, :priv
end


f = Foo.new

puts "Public"
f.pub

puts

puts "Protected"
puts "prot: #{Foo.method_visibility(:prot)}"
puts "protalias: #{Foo.method_visibility(:protalias)}"
puts "protaliasmethod #{Foo.method_visibility(:protaliasmethod)}"

puts

puts "Private"
puts "priv: #{Foo.method_visibility(:priv)}"
puts "privalias: #{Foo.method_visibility(:privalias)}"
puts "privaliasmethod: #{Foo.method_visibility(:privaliasmethod)}"

$ ruby -v attr.rb
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
Public

Protected
prot: public
protalias: public
protaliasmethod public

Private
priv: public
privalias: public
privaliasmethod: public

Is this intentional?

Also available in: Atom PDF