anchor.diff:    int _nextMove = 0;
     Completer _completer = new Completer();
   
  +  static final _moveDelay = new Duration(milliseconds: 500);
  +
     SolutionPlayer(this.tableau, this.solution);
   
     Future play() {
  -    new Timer.periodic(new Duration(milliseconds: 500), (timer) {
  +    new Timer.periodic(_moveDelay, (timer) {
         if (_nextMove >= solution.moves.length) {
  -        timer.stop();
  +        timer.cancel();
           _completer.complete();
           return;
         }
  
positive.code: 
    void _performMove(Move move) {
      if (move.count > 1)
        throw "Oops, need fancier logic";
  
      Pile source = _sourcePile(move);
      Card card = source.cards.last;
      Pile destination = _destiniationPile(move, card);
  
      assert(source.canTake(card));
      assert(destination.canAccept(card));
  
  
negative.code:     return null;
    }
  
    Cell _findFreeCell(Card card) {
      for (Cell cell in tableau.cells) {
        if (cell.canAccept(card))
          return cell;
      }
      assert(false);
      return null;
    }
  
    void _willRemoveFromPile(Card card) {
      CardCoordinator.instance.viewForCard(card).willRemoveFromPile();
    }
  