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, "#{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.human_name]])
end
transition
end.compact
if events.length == transitions.length
TransitionCollection.new(transitions, :actions => run_action).perform
else
false
end
end