public void placeToken(Token token, int row, int column)
            throws IllegalArgumentException
    {
        // Make sure the right token is playing this turn
        if (token != getNextTurn())
            throw new IllegalArgumentException(String.format("ERROR: %s, it is not your turn.", token));
        // Make sure it's a valid square
        if (row > this.boardSize || column > this.boardSize)
            throw new IllegalArgumentException(
                    String.format("ERROR: Your chose an invalid square. Row and column must be between 1 and %d", this.boardSize));
        // If the game is already over, no more tokens can be played.
        if (isGameOver)
            throw new IllegalStateException(
                    String.format("ERROR: This game is over already."));

        // Place the token iff the square is unoccupied
        Square currentSquare = new Square(row, column);
        Token currentToken = gameBoard.get(currentSquare);
        if (currentToken == null)
            gameBoard.put(currentSquare, token);
        else
            throw new IllegalArgumentException("ERROR: Square already occupied.");

        if (didLastPlayWin())
        {
            this.winner = token;
            this.isGameOver = true;
        }
    }