Each field in the @Config class is mapped to either a configuration category or a configuration property depending on its type.
If it's a type that implements Map, a category is created and a property is created in that category for each key-value pair in the Map. The Map must have String keys and primitive, primitive array, String or enum values.
If it's a type that directly extends Object, a category is created and a sub-category or property is created in that category for each field of the class following the same rules as the @Config class. These classes can be declared anywhere, they don't have be nested in the @Config class.
If it's a primitive, primitive array, enum or String, a property is created.
If it's any other type, an error is thrown.