diff --git a/lib/workflow.rb b/lib/workflow.rb index c2fddae..ef881be 100644 --- a/lib/workflow.rb +++ b/lib/workflow.rb @@ -266,9 +266,14 @@ def run_after_transition(from, to, event, *args) def run_action(action, *args) instance_exec(*args, &action) if action end + + def has_callback?(action) + self.respond_to?(action) or self.class.private_method_defined?(action) + end def run_action_callback(action_name, *args) - self.send action_name.to_sym, *args if self.respond_to?(action_name.to_sym) + action = action_name.to_sym + self.send(action, *args) if has_callback?(action) end def run_on_entry(state, prior_state, triggering_event, *args) diff --git a/test/main_test.rb b/test/main_test.rb index 563fcb8..585ab23 100644 --- a/test/main_test.rb +++ b/test/main_test.rb @@ -279,8 +279,36 @@ def my_transition(args) end state :two end + + private + def another_transition(args) + args.another_tran + end + end + a = c.new + a.my_transition!(args) + end + + test 'private transition callback' do + args = mock() + args.expects(:log).once + c = Class.new + c.class_eval do + include Workflow + workflow do + state :new do + event :assign, :transitions_to => :assigned + end + state :assigned + end + + private + def assign(args) + args.log('Assigned') + end end - c.new.my_transition!(args) + a = c.new + a.assign!(args) end test 'Single table inheritance (STI)' do