code: public static DynamicPropertyFactory initWithConfigurationSource(AbstractConfiguration config) {
          synchronized (ConfigurationManager.class) {
              if (config == null) {
                  throw new NullPointerException("config is null");
              }
              if (ConfigurationManager.isConfigurationInstalled() && config != ConfigurationManager.instance) {
                  throw new IllegalStateException("ConfigurationManager is already initialized with configuration "
                          + ConfigurationManager.getConfigInstance());
              }
              if (config instanceof DynamicPropertySupport) {
                  return initWithConfigurationSource((DynamicPropertySupport) config);
              }
              return initWithConfigurationSource(new ConfigurationBackedDynamicPropertySupportImpl(config));
          }
      }
docs: Initialize the factory with an AbstractConfiguration.
  <p/>
  The initialization will register a ConfigurationListener with the configuration so that {@link DynamicProperty}
  will receives a callback and refresh its value when a property is changed in the configuration.
  <p/>
  If the factory is already initialized with a default configuration source (see {@link #getInstance()}), it will re-register
  itself with the new configuration source passed to this method. Otherwise, this method will throw IllegalArgumentException
  if it has been initialized with a different and non-default configuration source. This method should be only called once.
  
  @param config Configuration to be attached with DynamicProperty
  @return the instance of DynamicPropertyFactory
  @throws IllegalArgumentException if the factory has already been initialized with a non-default configuration source