interface Move {}

/* A game board with undo */

abstract class Board {

    Board prev;

    void copyFrom (Board board) {
        this.prev = board.prev;
    }
    abstract Board copy();

    abstract void doMove (Move move);

    void back () {
	this.copyFrom (this.prev);
    }
    void forward (Move move) {
        Board board = this.copy();
        this.prev = board;
        this.doMove (move);
    }
}


class ChessBoard extends Board {
    boolean turn; /* ... further instance variables */
    
    ChessBoard () { /* initialize */ }
    
    void copyFrom (ChessBoard chessBoard) {
	super.copyFrom (chessBoard);
        this.turn = chessBoard.turn; /* ... further code */
    }        
    ChessBoard copy() {
	ChessBoard chessBoard = new ChessBoard();
        chessBoard.copyFrom (this);
        return chessBoard;
    }
    
    void doMove (Move move) { /* perform chess move */ }
}


