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 (Board chessBoard) {
	super.copyFrom (chessBoard);
        this.turn = ((ChessBoard)chessBoard).turn; /* ... further code */
    }        
    Board copy() {
	ChessBoard chessBoard = new ChessBoard();
        chessBoard.copyFrom (this);
        return (Board)chessBoard;
    }
    
    void doMove (Move move) { /* perform chess move */ }
}


