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