def fire_events(object, *events)
run_action = [true, false].include?(events.last) ? events.pop : true
transitions = events.collect do |event_name|
event = nil
detect {|name, machine| event = machine.events[event_name, :qualified_name]}
raise(InvalidEvent.new(object, event_name)) unless event
unless transition = event.transition_for(object)
machine = event.machine
event.on_failure(object)
end
transition
end.compact
if events.length == transitions.length
TransitionCollection.new(transitions, :actions => run_action).perform
else
false
end
end