Обратный вызов для классов, определенных внутри модуля - PullRequest
6 голосов
/ 16 ноября 2010

Ruby уже имеет несколько встроенных обратных вызовов .Есть ли обратный вызов для такого случая?Вроде как method_added, но для классов (или констант) внутри модуля, а не для методов экземпляра внутри класса.

Ответы [ 2 ]

4 голосов
/ 16 ноября 2010

Насколько я знаю, нет ничего такого, что вы описываете.Однако вот как вы можете создать свой собственный, используя Class::inherited.

module MyModule
  def self.class_added(klass)
    # ... handle it
  end
  class ::Class
    alias_method :old_inherited, :inherited
    def inherited(subclass)
      MyModule.class_added(subclass) if /^MyModule::\w+/.match subclass.name
      old_inherited(subclass)
    end
  end
end

module MyModule
  # now add classes
end
1 голос
/ 18 ноября 2010

Вы можете попробовать этот подход, определив свой собственный метод def_class:

module M
  def self.const_missing(name)
    const_set(name, Class.new)
  end

  def self.def_class(klass, &block)
    class_added(klass.name)
    klass.class_eval(&block)
  end
end

module M
  def self.class_added(klass)
    puts "new class added: #{klass}"
  end

  def_class Hello do
    def hello
      puts "hello!"
    end
  end
end

h = M::Hello.new.hello #=> "hello!"
...