code: static <T> void bindDynamicProvider(
        Binder binder, Class<T> clazz, Class<? extends Annotation> annotation) {
      binder.getProvider(Key.get(clazz, annotation));
  
      ParameterizedType type = Types.newParameterizedType(DynamicBindingProvider.class, clazz);
      DynamicBindingProvider<T> provider = new DynamicBindingProviderImpl<T>(TypeLiteral.get(clazz));
      @SuppressWarnings("unchecked")
      Key<DynamicBindingProvider<T>> key = (Key<DynamicBindingProvider<T>>) Key.get(type);
      binder.bind(key).toInstance(provider);
    }
docs: Binds a {@link DynamicBindingProvider} for the specified class.
  
  <p>The instance bound to the class can later be retrieved through
  {@link DynamicBindingProvider#get(Class)} given the same annotation provided during binding
  time. This method also 'requires' a binding of {@code clazz} to {@code annotation} to exist.
  
  <p>This method requires a binder, and must be used from a Guice module that is in the
  configure phase.
  
  @param binder the Guice binder to bind with
  @param clazz the class to create a {@link DynamicBindingProvider} for
  @param annotation the binding annotation that must be bound with the provided class