metaprogramming/singleton_hooks/undefined_parens.rb

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

# `singleton_method_undefined` fires when a singleton method is undefined,
# and `undef_method` in a `class << Klass` body reaches a method that
# `def Klass.name` put there.

klass = Class.new

def klass.singleton_method_undefined(name)
  puts("class undefined #{name}")
end

def klass.to_undefine
end

puts(klass.respond_to?(:to_undefine).to_s)

class << klass
  undef_method(:to_undefine)
end

puts(klass.respond_to?(:to_undefine).to_s)

begin
  klass.to_undefine
rescue NoMethodError
  puts("NoMethodError after undef")
end

# Undefining a name nothing defines is a NameError.
begin
  class << klass
    undef_method(:never_there)
  end
rescue NameError => error
  puts(error.class.to_s)
end

Output:

true
class undefined to_undefine
false
NoMethodError after undef
NameError