Confusion with protected methods

Below is the code making me confused :

class Foo
protected
def self.baz;end
end

Foo.protected_methods() # => [] # I expected [:baz]
Foo.public_methods(false) # => [:baz, :allocate, :new, :superclass]

Why am I getting empty?

Excerpts from Arup R.'s message of 2014-01-12 10:32:16 +0100:

Your problem is that the Module#protected method you use ony applies to
instance
methods you define, not to class method. This means that the baz class
method
you define is not protected at all. Look:

class Foo
protected
def self.baz
puts “Foo.baz”
end
end

Foo.baz
#output: Foo.baz

If you defined an instance method, it would have worked as you expected:

class Foo
protected
def baz #note that now this is an instance method
puts “Foo#baz”
end
end

Foo.new.baz
=> NoMethodError: protected method `baz’ called for
#Foo:0x00000000c65458

To make a class method protected, you have to do so from the class’s
singleton
class:

class Foo
def self.baz
puts “Foo.baz”
end
end

class << Foo
protected :baz
end

Foo.baz
=> NoMethodError: protected method `baz’ called for Foo:Class

I hope this helps

Stefano

Stefano C. wrote in post #1132886:

Excerpts from Arup R.'s message of 2014-01-12 10:32:16 +0100:

Your problem is that the Module#protected method you use ony applies to
instance
methods you define, not to class method. This means that the baz class
method

Thanks for your explanation.