def fire_event_attributes(object, action, complete = true)
transitions = map {|name, machine| machine.action == action ? machine.events.attribute_transition_for(object, true) : nil}.compact
return yield if transitions.empty?
action_value = nil
if result = transitions.all? {|transition| transition != false}
begin
result = Transition.perform(transitions, :after => complete) do
transitions.each {|transition| transition.machine.write(object, :event, nil)}
action_value = yield
end
rescue Exception
transitions.each do |transition|
transition.machine.write(object, :event, transition.event)
transition.machine.write(object, :event_transition, nil) if complete
end
raise
end
transitions.each do |transition|
transition.machine.write(object, :event, transition.event) unless complete && result
transition.machine.write(object, :event_transition, !complete && result ? transition : nil)
end
end
action_value.nil? ? result : action_value
end