introspection/singleton_method.rb

tests/_examples/introspection/singleton_method.rb in the metorex repository.

widget = Object.new
def widget.polish
  :shiny
end

polish = widget.singleton_method(:polish)
puts polish.class.name
puts polish.call.inspect

included = Module.new do
  def from_include
    :included
  end
end
widget.singleton_class.include(included)
puts widget.singleton_method(:from_include).call.inspect

prepended = Module.new do
  def from_prepend
    :prepended
  end
end
widget.singleton_class.prepend(prepended)
puts widget.singleton_method(:from_prepend).call.inspect

extension = Module.new do
  def from_extend
    :extended
  end
end
other = Object.new
other.extend(extension)
puts other.singleton_method(:from_extend).call.inspect

class Widget
  def instance_level
    :from_class
  end
end

plain = Widget.new
puts plain.instance_level.inspect
begin
  plain.singleton_method(:instance_level)
rescue NameError => error
  puts error.class.name
end

begin
  Object.new.singleton_method(:never_defined)
rescue NameError => error
  puts error.class.name
end

class Registry
  def self.lookup
    :found
  end
end
puts Registry.singleton_method(:lookup).call.inspect

Output:

Method
:shiny
:included
:prepended
:extended
:from_class
NameError
NameError
:found