void processMove(Move move, FreerailsPrincipal p) {
    /*
     * if the server is submitting the move, then act on behalf of whoever
     * move was submitted for
     */
    if (p.equals(Player.AUTHORITATIVE)) p = move.getPrincipal();

    moveStack.add(move);

    if (moveStack.size() > MAX_UNDOS) {
      moveStack.removeFirst();
    }

    MoveStatus ms;

    synchronized (world) {
      ms = move.doMove(world, p);
    }

    if (ms != MoveStatus.MOVE_OK)
      logger.log(Level.INFO, "Server rejected move because " + ms + ": " + move);

    forwardMove(move, ms);
  }