class Board {
List<Position> positions();
};
class InitialBoard extends Board {
void moveTo(Position pos);
static void startGame(GameState state);
};
class InProgressBoard extends Board {
void moveTo(Position pos);
void takeBack();
};
class FinishedBoard extends Board {
void takeBack();
};
interface GameState {
void gameWillStart(InitialBoard brd);
void gameDidContinue(InProgressBoard brd);
void gameDidFinishWithVictor(FinishedBoard brd, Player victor);
void gameDidFinishWithDraw(FinishedBoard brd);
void illegalMoveAttempted(InProgressBoard brd, Position illegalMove);
};