@Contract(pure = true)
  default <T> @NotNull OptionController onValue(@NotNull String bindId, @NotNull Supplier<@NotNull T> getter,
                                                @NotNull Consumer<@NotNull T> setter) {
    OptionController controller = this;
    return new OptionController() {
      @Override
      public void setOption(@NotNull String _bindId, Object value) {
        if (_bindId.equals(bindId)) {
          //noinspection unchecked
          setter.accept((T)value);
        }
        else {
          controller.setOption(_bindId, value);
        }
      }

      @Override
      public Object getOption(@NotNull String _bindId) {
        if (_bindId.equals(bindId)) {
          return getter.get();
        }
        return controller.getOption(_bindId);
      }

      @Override
      public @Nullable OptionControlInfo findControl(@NotNull String bindId) {
        return controller.findControl(bindId);
      }
    };
  }
@Contract(pure = true)
  default <T> @NotNull OptionController onValue(@NotNull String bindId, @NotNull Supplier<@NotNull T> getter,
                                                @NotNull Consumer<@NotNull T> setter)