anchor.diff:        var match = prefixMatch(route.path, path);
         var tailPath = path.substring(match.end);
         if (!identical(route, _currentRoute)) {
  -        _processNewRoute(path, tailPath, match, route, completer);
  -      } else {
  -        if (route.child != null) {
  -          route.child.handle(tailPath).then((_) {
  -            completer.complete();
  -          });
  -        } else {
  -          completer.complete();
  -        }
  -      }
  -    } else {
  +        return _processNewRoute(path, tailPath, match, route);
  +      } else if (route.child != null)  {
  +        return route.child.handle(tailPath);
  +      }
  +    } else { // TODO(pavelgj): delete this
         var url = _getUrl(path);
         if (url != null) {
           // always give handlers a non-fragment path
  
positive.code:    * with the path version of the URL by converting the # to a /.
     */
    Future handle(String path) {
      Completer completer = new Completer();
      List matchingRoutes = _routes.where((r) => matchesPrefix(r.path, path)).toList();
      if (!matchingRoutes.isEmpty) {
        if (matchingRoutes.length > 1) {
          _logger.warning("More than one route matches $path");
  
negative.code: 
  class RouteEvent {
    final String path;
    Future<bool> _allowLeaveFuture;
  
    RouteEvent(this.path);
  
    void allowLeave(Future<bool> allow) {
      _allowLeaveFuture = allow;
    }
  
    RouteEvent _clone() => new RouteEvent(path);
  }
  
  abstract class Routable {
  