code: public static ValueType fromConfig(String property) {
        //If the property is valid and we cannot find a "property.type" then the value of the property represents its simple type.
        if (Config.hasProperty(property) && !Config.hasProperty(property, TYPE_PROPERTY)) {
           return new SimpleValueType(Config.get(property).asClass());
        }
  
        if( Config.isBean(property) ){
           Object o = Config.get(property);
           return new SimpleValueType(o.getClass());
        }
  
        //Read in the value type parameters from the configuration using the property as the prefix
        Map<String, Class> typeInfo = Config.getMap(property, String.class, Class.class);
        //Set the type class to the type property defaulting to String if not found
        Class<?> typeClass = typeInfo.getOrDefault(TYPE_PROPERTY, String.class);
  
  
        //Check for a collection
        if (Collection.class.isAssignableFrom(typeClass)) {
           return new CollectionValueType(typeClass,
                                          typeInfo.getOrDefault(ELEMENT_TYPE_PROPERTY, String.class)
           );
        }
  
        //Check for a Map
        if (Map.class.isAssignableFrom(typeClass)) {
           return new MapValueType(typeClass,
                                   typeInfo.getOrDefault(KEY_TYPE_PROPERTY, String.class),
                                   typeInfo.getOrDefault(VALUE_TYPE_PROPERTY, String.class)
           );
        }
  
        return new SimpleValueType(typeClass);
     }
docs: Creates a <code>ValueType</code> for the given configuration property. T
  
  @param property the property name to create a ValueType from
  @return the value type representing the property