@Override
  public <TT> ValueKey.@NotNull BeforeThen<? extends T, TT> ifEq(@NotNull ValueKey<? extends TT> key) {
    switch (myState) {
      case FINISHED:
        throw new IllegalStateException("Matching is already finished");
      case IGNORING:
      case MATCHING:
      case SKIPPING:
        throw new IllegalStateException("'then'/'thenGet'/'or' call is expected");
      case MATCHED:
        if (key.getName().equals(myKey)) {
          throw new IllegalStateException("Key '" + key.getName() + "' already matched");
        }
        myState = State.SKIPPING;
        break;
      case NOT_MATCHED:
        myState = key.getName().equals(myKey) ? State.MATCHING : State.IGNORING;
    }
    //noinspection unchecked
    return (ValueKey.BeforeThen<T, TT>)this;
  }
@Override
  public <TT> ValueKey.@NotNull BeforeThen<? extends T, TT> ifEq(@NotNull ValueKey<? extends TT> key)