anchor.diff:        var match = prefixMatch(route.path, path);
         var tailPath = path.substring(match.end);
         if (!identical(route, _currentRoute)) {
  -        var headPath = path.substring(0, match.end);
  -        var event = new RouteEvent(headPath,
  -            (_) => throw new StateError('Cannot veto on enter!'));
  -        // before we make this a new current route, leave the old
  -        _leaveCurrentRoute(event).then((bool allowNavigation) {
  -          if (allowNavigation) {
  -            _currentRoute = route;
  -            if (route.enter != null) {
  -              route.enter(event);
  -            }
  -            if (route.child != null) {
  -              route.child.handle(tailPath).then((_) {
  -                completer.complete();
  -              });
  -            } else {
  -              completer.complete();
  -            }
  -          } else {
  -            completer.complete();
  -          }
  -        });
  +        _processNewRoute(path, tailPath, match, route, completer);
         } else {
           if (route.child != null) {
             route.child.handle(tailPath).then((_) {
  
positive.code:     return completer.future;
    }
  
    Future<bool> _leaveCurrentRoute(RouteEvent e) {
      Completer<bool> completer = new Completer<bool>();
      if (_currentRoute != null) {
        List<Future<bool>> pendingResponses = <Future<bool>>[];
        var event = e._clone((Future<bool> r) => pendingResponses.add(r));
  
        if (_currentRoute.leave != null) {
  
negative.code:         _currentRoute.child._leaveCurrentRoute(event).then((allowNavigation) {
            if (!allowNavigation) {
              completer.complete(false);
            } else {
              _completePendingResponses(pendingResponses, completer);
            }
          });
        } else {
          _completePendingResponses(pendingResponses, completer);
        }
      } else {
        completer.complete(true);
      }
      return completer.future;
    }
  
    _completePendingResponses(List<Future<bool>> pendingResponses,
                              Completer<bool> completer) {
      if (pendingResponses.length == 0) {
        completer.complete(true);
      } else {
        Future.wait(pendingResponses).then((List<bool> responses) {
          completer.complete(responses.reduce(reduceBools));
        });
      }
    }
  
    /**
  