Это невозможно из коробки, так как aasm
отбрасывает блоки кода, переданные в вызовы событий, но эй, это ruby.
require 'aasm'
class TestClass
include AASM
aasm do
state :created, initial: true
state :running
event :run do
transitions from: :created,
to: :running,
after: -> { @λ_run.call(1) if @λ_run } # invoke the code block if was passed
end
end
end
TestClass.prepend(Module.new do
def run!(*args, &λ)
@λ_run = λ # store the code block passed to the method
super
end
end)
TestClass.new.run! { |v| puts v.inspect }
С небольшим количеством метапрограммирования его легко расширитьвсем определенным обработчикам событий.