Je ne peux pas penser ou trouver un moyen intégré dans Ruby pour le faire.
Une alternative serait de modifier directement la classe Module
pour créer le rappel. Pour ce faire, nous pouvons ajouter des méthodes wrapper autour des méthodes originales include
et extend
pour forcer l'exécution de nos callbacks définis chaque fois que les méthodes include
ou extend
sont appelées.
Quelque chose le long des lignes devrait fonctionner:
class Module
def self.before
m_include = instance_method(:include)
m_extend = instance_method(:extend)
define_method(:include) do |*args, &block|
included_callback(args[0])
m_include.bind(self).call(*args, &block)
end
define_method(:extend) do |*args, &block|
extend_callback(args[0])
m_extend.bind(self).call(*args, &block)
end
end
def included_callback(mod_name)
puts "#{self} now has included Module #{mod_name}"
end
def extend_callback(mod_name)
puts "#{self} now has extended Module #{mod_name}"
end
before
end
Un exemple pour vérifier que cela fonctionne:
module Awesome
def bar
puts "bar"
end
def self.baz
puts "baz"
end
end
class TestIncludeAwesome
include Awesome
end
class TestExtendAwesome
extend Awesome
end
Le code exemple doit imprimer en sortie les éléments suivants:
> TestIncludeAwesome now has included Module Awesome
> TestExtendAwesome now has extended Module Awesome
callback 'inclus' est ce que vous voulez, je ne comprends pas quelle est votre confusion – Tsao
@Tsao, ce n'est pas si coupé-et-séché. Si la classe 'C' inclut le module' M' et 'M' utilise' included' pour inclure 'M' dans une autre classe' D' ('D.include (M)'), le rappel de 'M'' inclus' fera que 'M' sera inclus dans' D' une seconde fois, puis une troisième fois, et ainsi de suite. –