anchor.diff:      return _run.emit(new ClearDialogEvent());
     }
   
  -  Future<DialogEvent> once({String dialog, String from, String to}) {
  +  /// Listens for next emitted dialog which matches the provided criteria.
  +  ///
  +  /// [named] criteria trumps all others.
  +  Future<DialogEvent> once(
  +      {String dialog, String from, String to, String named}) {
  +    if (_notNull(named)) {
  +      return this.dialog.firstWhere((e) => e.name == named);
  +    }
  +
       var conditions = [];
  +
       if (_notNull(dialog)) conditions.add((e) => e.dialog == dialog);
       if (_notNull(from)) conditions.add((e) => e.from = from);
       if (_notNull(to)) conditions.add((e) => e.to == to);
  +
       return this.dialog.firstWhere((e) => conditions.every((c) => c(e)));
     }
   
  
positive.code:       };
  
    bool operator ==(dynamic other) => other is DialogEvent &&
        alias == other.alias &&
        dialog == other.dialog &&
        from == other.from &&
        to == other.to &&
        replies == other.replies;
  }
  
  class Replies {
  
negative.code:       String action, Map<String, dynamic> args, InterfaceHandler handler) {
      if (handler is DialogInterfaceHandler &&
          action == 'reply' &&
          new DialogEvent.fromJson(args['dialogEvent']).name ==
              _dialogEventName) {
        _hasReplied = true;
        _run.changeMode(_dialog, _previous);
        handler.handle(action, args);
  