Получение списка классов, которые включают модуль

У меня есть миксин, для которого я хотел бы получить список всех классов, которые включили это. В модуле миксина я сделал следующее:

module MyModule
  def self.included(base)
    @classes ||= []
    @classes << base.name
  end

  def self.classes
    @classes
  end
end

class MyClass
  include MyModule
end

Это работает очень хорошо:

> MyModule.classes #=> nil
> MyClass.new #=> #<MyClass ...>
> MyModule.classes #=> ["MyClass"]

Теперь я хотел бы выделить эту часть в отдельный модуль, который можно включить в другие мои миксины. Итак, я придумал следующее:

module ListIncludedClasses
  def self.included(base)
    p "...adding #{base.name} to #{self.name}.classes"

    @classes ||= []
    @classes << base.name

    base.extend(ClassMethods)
  end

  def self.classes
    @classes
  end

  module ClassMethods
    def included(module_base)
      p "...adding #{module_base.name} to #{self.name}.classes"

      @module_classes ||= []
      @module_classes << module_base.name
      super(module_base)
    end
    def classes
      @module_classes
    end
  end

end

module MyModule
  include ListIncludedClasses
end

Это не работает, потому что метод #included (module_base), добавляемый в MyModule из ListIncludedClasses, никогда не запускается. Интересно, что он успешно добавляет # классы в MyModule.

Любая помощь приветствуется.

5
задан IEb 12 October 2010 в 18:38
поделиться