anchor.diff:    Future<DialogEvent> add(String dialog,
         {String from,
         String to,
  +      String named,
         Duration delay: Duration.ZERO,
         Replies replies: const _NoReplies()}) {
  -    var event = new DialogEvent(dialog, from: from, to: to, replies: replies);
  +    var event = new DialogEvent(dialog,
  +        from: from, to: to, replies: replies, name: named);
  +
  +    if (_previousDialogNames.contains(event.name)) {
  +      throw new ArgumentError("Added dialog names must be unique. Dialog names "
  +          "are useful as a way to distinguish otherwise similar dialogs. "
  +          "Note that if you did not provide a name explicitly, it was computed "
  +          "from the dialogs other attributes, and must still be unique. "
  +          "By enforcing a name's uniqueness, you can rely on referring to a "
  +          "dialog's name as only ever referring to the one dialog you mean it "
  +          "to. Dialog added was: $event.");
  +    }
  +
  +    _previousDialogNames.add(event.name);
   
       if (replies.modal) {
  -      _run.changeMode(this, new MustReplyMode(_run, event, this));
  +      _run.changeMode(this, new MustReplyMode(_run, event.name, this));
       }
   
       return _run.emit(event, delay: delay);
  
positive.code:   bool operator ==(dynamic other) => other is Replies &&
        modal == other.modal &&
        const IterableEquality().equals(available, other.available);
  }
  
  class MustReplyMode implements Mode {
    final Run _run;
    final DialogEvent _dialogEvent;
    final Mode _previous;
    final Dialog _dialog;
    bool _hasReplied = false;
  
    MustReplyMode(Run run, this._dialogEvent, this._dialog)
        : _run = run,
          _previous = run.currentMode;
  
  
negative.code:       {String reply,
        String forDialog,
        String forDialogTo,
        String forDialogFrom,
        String forDialogNamed}) {
      var conditions = [];
  
      if (_notNull(reply)) {
        conditions.add((e) => e.reply == reply);
      }
  
      if (_notNull(forDialogNamed)) {
        conditions.add((e) => e.dialogEvent.name == forDialogNamed);
      } else {
        if (_notNull(forDialog)) {
          conditions.add((e) => e.dialogEvent.dialog == forDialog);
        }
  
        if (_notNull(forDialogTo)) {
          conditions.add((e) => e.dialogEvent.to == forDialogTo);
        }
  
        if (_notNull(forDialogFrom)) {
          conditions.add((e) => e.dialogEvent.from == forDialogFrom);
        }
  
        if (conditions.isEmpty) {
          throw new ArgumentError("Must pass at least one criteria for a reply.");
        }
      }
  
      return replies.firstWhere((e) => conditions.every((c) => c(e)));
  