Если я вас правильно понял, следующее будет делать то, что вы хотите.
Инициализирует каждый класс (или модуль), включая ProcessRunner
, пустой массив в @@processors
. Кроме того, он добавляет методы класса processors
(простой метод получения) и add_processor
.
Метод process
должен быть скорректирован для использования метода класса. На самом деле, вы могли бы добавить обертку для этого, но я думаю, что это было бы многословно для такого образца.
module ProcessRunner
module ClassMethods
def add_processor(processor)
processors << processor
end
def processors
class_variable_get :@@processors
end
end
def self.included(mod)
mod.send :class_variable_set, :@@processors, []
mod.extend ClassMethods
end
def process
self.class.processors.each {|meth| self.send(meth)}
end
end
class RunTheseMethodsWhenICallProcess
include ProcessRunner
add_processor :a_method_to_run
add_processor :another_method_to_run
def a_method_to_run
puts "This method ran"
end
def another_method_to_run
puts "another method ran"
end
end