Recentemente, descobri que precisava de #define_singleton_method
um projeto que ainda está rodando Ruby 1.8.7 – sim, sim, eu sei … Mas não sou o único. Claro, se for no contexto de um aplicativo Ruby on Rails, a equipe principal foi legal o suficiente para fazer back-port Object#singleton_class
para lidar com situações como essa. Porém, fora de uma aplicação Rails, você ainda pode precisar de algo para obter a classe singleton (ou metaclasse , se você preferir essa terminologia).
Felizmente, as classes abertas de Ruby nos permitem trabalhar um pouco de mágica assim:
class Object
def singleton_class
class << self; self; end
end
end
E voila! Agora você pode fazer algo assim:
some_object.singleton_class.send :define_method, :method_name { method.body }
Boa codificação!