introspection/method_owners.rb
tests/_examples/introspection/method_owners.rb in the metorex repository.
# A Method names the class that holds it, whichever singleton class the
# lookup walked through to reach it. Materializing a singleton class
# somewhere else leaves that answer alone.
p String.method(:include).owner
p String.method(:include).receiver
p String.method(:include).name
Array.singleton_class
p String.method(:include).owner
# A class method made private is hidden from the outside and left out of the
# names the class reports, while the owner of an unrelated method stands.
class Ledger
def self.open_entry; :open; end
def self.closed_entry; :closed; end
private_class_method :closed_entry
end
p Ledger.open_entry
p Ledger.respond_to?(:closed_entry)
p Ledger.singleton_methods(false).sort
begin
Ledger.closed_entry
rescue NoMethodError => problem
p problem.class
end
p Ledger.singleton_class.private_instance_methods(false).include?(:closed_entry)
p String.method(:include).owner
# One made public again answers from the outside.
Ledger.public_class_method :closed_entry
p Ledger.closed_entry
p Ledger.singleton_methods(false).sort
Output:
Module
String
:include
Module
:open
false
[:open_entry]
NoMethodError
true
Module
:closed
[:closed_entry, :open_entry]