From 6396847041f78bcbf44178047a2d5f9ad662fb35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thorsten=20B=C3=B6ttger?= Date: Mon, 28 Sep 2015 21:19:02 +1300 Subject: [PATCH] provide after_all_transitions callback --- lib/aasm/base.rb | 4 ++++ lib/aasm/core/transition.rb | 1 + lib/aasm/state_machine.rb | 11 ++++++++++- spec/models/callbacks/basic.rb | 3 +++ spec/unit/callbacks_spec.rb | 1 + 5 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/aasm/base.rb b/lib/aasm/base.rb index d1fa2b7..a2a9e11 100644 --- a/lib/aasm/base.rb +++ b/lib/aasm/base.rb @@ -109,6 +109,10 @@ module AASM EORUBY end + def after_all_transitions(*callbacks, &block) + @state_machine.add_global_callbacks(:after_all_transitions, *callbacks, &block) + end + def states @state_machine.states end diff --git a/lib/aasm/core/transition.rb b/lib/aasm/core/transition.rb index d13fa9a..779bb89 100644 --- a/lib/aasm/core/transition.rb +++ b/lib/aasm/core/transition.rb @@ -30,6 +30,7 @@ module AASM::Core end def execute(obj, *args) + invoke_callbacks_compatible_with_guard(event.state_machine.global_callbacks[:after_all_transitions], obj, args) invoke_callbacks_compatible_with_guard(@after, obj, args) end diff --git a/lib/aasm/state_machine.rb b/lib/aasm/state_machine.rb index 001387a..e511dfc 100644 --- a/lib/aasm/state_machine.rb +++ b/lib/aasm/state_machine.rb @@ -10,12 +10,13 @@ module AASM (@machines ||= {})[klass.to_s] = machine end - attr_accessor :states, :events, :initial_state, :config, :name + attr_accessor :states, :events, :initial_state, :config, :name, :global_callbacks def initialize(name) @initial_state = nil @states = [] @events = {} + @global_callbacks = {} @config = AASM::Configuration.new @name = name end @@ -40,6 +41,14 @@ module AASM @events[name] = AASM::Core::Event.new(name, self, options, &block) end + def add_global_callbacks(name, *callbacks, &block) + @global_callbacks[name] ||= [] + callbacks.each do |callback| + @global_callbacks[name] << callback + end + @global_callbacks[name] << block if block + end + private def set_initial_state(name, options) diff --git a/spec/models/callbacks/basic.rb b/spec/models/callbacks/basic.rb index 2cadac1..3b4e514 100644 --- a/spec/models/callbacks/basic.rb +++ b/spec/models/callbacks/basic.rb @@ -18,6 +18,8 @@ module Callbacks end aasm do + after_all_transitions :after_all_transitions + state :open, :initial => true, :before_enter => :before_enter_open, :enter => :enter_open, @@ -68,6 +70,7 @@ module Callbacks def transition_guard; log('transition_guard'); !@fail_transition_guard; end def after_transition; log('after_transition'); end + def after_all_transitions;log('after_all_transitions');end def before_event; log('before_event'); end def after_event; log('after_event'); end diff --git a/spec/unit/callbacks_spec.rb b/spec/unit/callbacks_spec.rb index 1cee0a6..bef7f2b 100644 --- a/spec/unit/callbacks_spec.rb +++ b/spec/unit/callbacks_spec.rb @@ -17,6 +17,7 @@ describe 'callbacks for the new DSL' do expect(callback).to receive(:exit_open).once.ordered # expect(callback).to receive(:event_guard).once.ordered.and_return(true) # expect(callback).to receive(:transition_guard).once.ordered.and_return(true) + expect(callback).to receive(:after_all_transitions).once.ordered expect(callback).to receive(:after_transition).once.ordered expect(callback).to receive(:before_enter_closed).once.ordered expect(callback).to receive(:enter_closed).once.ordered