private Board place(Board board, int row, int col, PlaceMode erase) throws CloneNotSupportedException
    {
        boolean collision = false;
        Board tmpBoard = board.clone();

        // Iterate over the shape
        for (int i = 0; i < shape.numrows; i++)
        {
            for (int j = 0; j < shape.numcols; j++)
            {
                // If there is part of the shape, see if it can be put in the board.
                // If not, sound a collision
                if (shape.data[i][j] == symbol)
                {

                    // Will it go out of bounds?
                    if ((row + i > board.numRows() - 1) || (col + j > board.numCols() - 1))
                    {
                        collision = true;
                        break;
                    }

                    // Does it overlap another shape? Don't want to for place mode, want to
                    // for erase mode.
                    int findInt = (erase == PlaceMode.erase) ? symbol : BLANK;
                    if (board.getValue(row + i, col + j) != findInt)
                    {
                        collision = true;
                        break;
                    }
                    else
                    {
                        tmpBoard.setValue(row + i, col + j, (erase == PlaceMode.erase) ? BLANK : symbol);
                    }
                }
            }
        }

        // If there was no collision, copy the new board over the old one
        if (!collision)
        {
            board = tmpBoard.clone();
        }

        // Update our private variable for later retrieval
        lastCollision = collision;

        return board;
    }