def fire_events(object, *events)
run_action = [true, false].include?(events.last) ? events.pop : true
transitions = events.collect do |event_name|
event = nil
detect do |name, machine|
event = machine.events[event_name, :qualified_name]
end
raise InvalidEvent, "#{event_name.inspect} is an unknown state machine event" unless event
unless transition = event.transition_for(object)
machine = event.machine
machine.invalidate(object, :state, :invalid_transition, [[:event, event_name]])
end
transition
end.compact
if events.length == transitions.length
Transition.perform_within_transaction(transitions, :action => run_action)
else
false
end
end