Metaprogramming: ¿Cómo descubrir la clase real de un objeto?

staba bromeando con la metaprogramación en Ruby e hice este código:

class Class
  def ===(other)
    other.kind_of?(self)
  end
end
class FakeClass
  def initialize(object)
    methods.each {|m| eval "undef #{m}" if m.to_sym != :methods }
    define = proc do |m|
      eval(<<-END)
        def #{m}(*a, &b)
          @object.#{m}(*a, &b)
        rescue Object
          raise $!.class, $!.message.gsub("FakeClass", @object.class.to_s),
                $!.backtrace-[$!.backtrace[-caller.size-1]]
        end
      END
    end
    object.methods.each {|m| define[m] }
    def method_missing(name, *a, &b)
      if @object.methods.include?(name.to_s)
        define[name]
        eval "@object.#{name}(*a, &b)"
      elsif @object.methods.include?("method_missing")
        eval "@object.#{name}(*a, &b)"
      else
        super
      end
    rescue Object
      raise $!.class, $!.message.gsub("FakeClass", @object.class.to_s),
            $!.backtrace-[$!.backtrace[-caller.size-1]]
    end
    @object = object
  end
end

Esto crea una clase falsa que imita un objeto. Mira

a = FakeClass.new(1)  # => 1
a.class               # => Fixnum
a.methods             # => Return all Fixnum methods
a + 1                 # => 2 (is not a FakeClass)
Fixnum === a          # => true
a.something           # => NoMethodError:
                      #    undefined method `something' for 1:Fixnum
class Fixnum
  def foo
    true
  end
end

a.foo                 # => true

El problema es que ahora no sé cómo saber si un objeto es real o falso. En otras palabras, si#class devuelve la verdadera clase del objeto. ¿Existe alguna forma de rubí puro para diferenciar?

Piense en un escenario donde no sé si existe FakeClass o no sé cuál es el nombre de FakeClass. Significa que no puedo editar FakeClass para agregar un método como#is_fake?.

PS: Sé quea.instance_eval {self} devuelve el objeto (no falso). Pero no ayuda comprobar sia es falso

Respuestas a la pregunta(6)

Su respuesta a la pregunta