class AASM::Core::Event

def _fire(obj, options={}, to_state=::AASM::NO_VALUE, *args)

def _fire(obj, options={}, to_state=::AASM::NO_VALUE, *args)
  result = options[:test_only] ? false : nil
  clear_failed_callbacks
  transitions = @transitions.select { |t| t.from == obj.aasm(state_machine.name).current_state || t.from == nil}
  return result if transitions.size == 0
  if to_state == ::AASM::NO_VALUE
    to_state = nil
  elsif !(to_state.respond_to?(:to_sym) && transitions.map(&:to).flatten.include?(to_state.to_sym))
    # to_state is an argument
    args.unshift(to_state)
    to_state = nil
  end
  
  # nop, to_state is a valid to-state
  transitions.each do |transition|
    next if to_state and !Array(transition.to).include?(to_state)
    if (options.key?(:may_fire) && transition.eql?(options[:may_fire])) ||
       (!options.key?(:may_fire) && transition.allowed?(obj, *args))
      if options[:test_only]
        result = transition
      else
        result = to_state || Array(transition.to).first
        Array(transition.to).each {|to| @valid_transitions[obj.object_id][to] = transition }
        transition.execute(obj, *args)
      end
      break
    end
  end
  result
end