public static <T, V> VariantTagFragment<T, V> createFragment(String id,
                                                               @Nls(capitalization = Nls.Capitalization.Sentence) String name,
                                                               @Nls(capitalization = Nls.Capitalization.Title) String group,
                                                               Supplier<? extends V[]> variantsProvider,
                                                               Function<? super T, ? extends V> getter,
                                                               BiConsumer<? super T, ? super V> setter,
                                                               Predicate<? super T> initialSelection) {
    Ref<VariantTagFragment<T, V>> ref = new Ref<>();
    VariantTagButton<V> tagButton = new VariantTagButton<>(name, (e) -> ref.get().toggle(false, null));
    VariantTagFragment<T, V> fragment = new VariantTagFragment<>(id, name, group, tagButton, variantsProvider, getter, setter, initialSelection);
    tagButton.myFragment = fragment;
    Disposer.register(fragment, tagButton);
    ref.set(fragment);
    return fragment;
  }
public static <T, V> VariantTagFragment<T, V> createFragment(String id,
                                                               @Nls(capitalization = Nls.Capitalization.Sentence) String name,
                                                               @Nls(capitalization = Nls.Capitalization.Title) String group,
                                                               Supplier<? extends V[]> variantsProvider,
                                                               Function<? super T, ? extends V> getter,
                                                               BiConsumer<? super T, ? super V> setter,
                                                               Predicate<? super T> initialSelection)