private static void buildObjectInfoMap(
            final ObjectMapper objectMapper,
            final AbstractConfig config,
            final PropertyPath path,
            final Map<PropertyPath, ObjectInfo<? extends AbstractConfig>> objectInfoMap) {

        LOGGER.trace("addConfigObjectMethods({}, {}, .....)", config, path);

        config.setBasePath(path);

        final ObjectInfo<AbstractConfig> objectInfo = PropertyUtil.getObjectInfo(
                objectMapper,
                path.getPropertyName(),
                config);

        if (objectInfo.getConstructor() == null) {
            throw new RuntimeException("No JsonCreator constructor for " + config.getClass().getName());
        }

        objectInfoMap.put(path, objectInfo);

        objectInfo.getPropertyMap()
                .forEach((k, prop) -> {
                    final PropertyPath fullPath = path.merge(prop.getName());

                    final Class<?> valueType = prop.getValueClass();

                    LOGGER.trace(() -> LogUtil.message("prop: {}, class: {}", prop, prop.getValueClass()));

                    if (AbstractConfig.class.isAssignableFrom(valueType)) {
                        final AbstractConfig childConfigObject = (AbstractConfig) prop.getValueFromConfigObject();
                        // This must be a branch, i.e. config object so recurse into that
                        if (childConfigObject != null) {
                            // Recurse into the child
                            buildObjectInfoMap(
                                    objectMapper,
                                    childConfigObject,
                                    fullPath,
                                    objectInfoMap);
                        }
//                    } else {
//                        // This is not expected
//                        throw new RuntimeException(LogUtil.message(
//                                "Unexpected bean property of type [{}], expecting an instance of {}, " +
//                                        "or a supported type.",
//                                valueType.getName(),
//                                AbstractConfig.class.getSimpleName()));
                    }
                });
    }
@return All the classes that can be obtained from ConfigMapper
stroom-config/stroom-config-global-impl/src/main/java/stroom/config/global/impl/ConfigMapper.java