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