metaprogramming/singleton_hooks/removed.rb

tests/_examples/metaprogramming/singleton_hooks/removed.rb in the metorex repository.

# `singleton_method_removed` fires when a singleton method goes, including
# from a `class << obj` body, which reaches a method put there by
# `def obj.name`.

klass = Class.new

def klass.singleton_method_removed(name)
  puts "class lost #{name}"
end

def klass.to_remove
end

class << klass
  remove_method :to_remove
end

puts klass.respond_to?(:to_remove).to_s

object = Object.new

def object.singleton_method_removed(name)
  puts "object lost #{name}"
end

def object.gone
end

class << object
  remove_method :gone
end

puts object.respond_to?(:gone).to_s

# Removing a name nothing defines is a NameError.
begin
  class << object
    remove_method :never_there
  end
rescue NameError => error
  puts error.class.to_s
end

Output:

class lost to_remove
false
object lost gone
false
NameError