    001package com.typesafe.config;
    002
    003import com.typesafe.config.impl.ConfigBeanImpl;
    004
    005/**
    006 * Factory for automatically creating a Java class from a {@link Config}.
    007 * See {@link #create(Config,Class)}.
    008 *
    009 * @since 1.3.0
    010 */
    011public class ConfigBeanFactory {
    012
    013    /**
    014     * Creates an instance of a class, initializing its fields from a {@link Config}.
    015     *
    016     * Example usage:
    017     *
    018     * <pre>
    019     * Config configSource = ConfigFactory.load().getConfig("foo");
    020     * FooConfig config = ConfigBeanFactory.create(configSource, FooConfig.class);
    021     * </pre>
    022     *
    023     * The Java class should follow JavaBean conventions. Field types
    024     * can be any of the types you can normally get from a {@link
    025     * Config}, including <code>java.time.Duration</code> or {@link
    026     * ConfigMemorySize}. Fields may also be another JavaBean-style
    027     * class.
    028     *
    029     * Fields are mapped to config by converting the config key to
    030     * camel case.  So the key <code>foo-bar</code> becomes JavaBean
    031     * setter <code>setFooBar</code>.
    032     *
    033     * @since 1.3.0
    034     *
    035     * @param config source of config information
    036     * @param clazz class to be instantiated
    037     * @param <T> the type of the class to be instantiated
    038     * @return an instance of the class populated with data from the config
    039     * @throws ConfigException.BadBean
    040     *     If something is wrong with the JavaBean
    041     * @throws ConfigException.ValidationFailed
    042     *     If the config doesn't conform to the bean's implied schema
    043     * @throws ConfigException
    044     *     Can throw the same exceptions as the getters on <code>Config</code>
    045     */
    046    public static <T> T create(Config config, Class<T> clazz) {
    047        return ConfigBeanImpl.createInternal(config, clazz);
    048    }
    049}