@Contract(pure = true)
  default @NotNull OptionController onPrefixes(@NotNull Function<@NotNull String, @Nullable OptionController> locator) {
    OptionController controller = this;
    return new OptionController() {
      @Override
      public void setOption(@NotNull String bindId, Object value) {
        int dot = bindId.indexOf('.');
        if (dot == -1) {
          controller.setOption(bindId, value);
          return;
        }
        String prefix = bindId.substring(0, dot);
        OptionController subController = locator.apply(prefix);
        if (subController == null) {
          controller.setOption(bindId, value);
          return;
        }
        subController.setOption(bindId.substring(dot + 1), value);
      }

      @Override
      public Object getOption(@NotNull String bindId) {
        int dot = bindId.indexOf('.');
        if (dot == -1) {
          return controller.getOption(bindId);
        }
        String prefix = bindId.substring(0, dot);
        OptionController subController = locator.apply(prefix);
        if (subController == null) {
          return controller.getOption(bindId);
        }
        return subController.getOption(bindId.substring(dot + 1));
      }

      @Override
      public @Nullable OptionControlInfo findControl(@NotNull String bindId) {
        int dot = bindId.indexOf('.');
        if (dot == -1) {
          return controller.findControl(bindId);
        }
        String prefix = bindId.substring(0, dot);
        OptionController subController = locator.apply(prefix);
        if (subController == null) {
          return controller.findControl(bindId);
        }
        return subController.findControl(bindId.substring(dot + 1));
      }
    };
  }
@Contract(pure = true)
  default @NotNull OptionController onPrefixes(@NotNull Function<@NotNull String, @Nullable OptionController> locator)