Проблема в том, что включение модулей не добавляет методы в классы - оно только меняет цепочку вызовов методов.Эта цепочка определяет, какие классы / модули будут искать для метода, который не определен для рассматриваемого класса.То, что происходит, когда вы включаете модуль, является добавлением записи в этой цепочке.
Это то же самое, что и при добавлении метода в суперкласс - это не вызывает method_added
, так как он не определен в суперклассе.Было бы очень странно, если бы подкласс мог изменить поведение суперкласса.
Это можно исправить, вручную вызвав метод, добавленный для включенного модуля, переопределив include
для вашего класса:
class Foobar
def self.include(included_module)
included_module.instance_methods.each{|m| self.method_added(m)}
super
end
end
И это намного безопаснее, чем переопределение метода included
в Module
- изменение сужается только для классов, которые вы определили сами.