Property parent = (Property) builder.getAttributes().get(DESCENDANT_OF); if (parent != null) { typeRef = parent.getTypeRef(); unwrapped = TypeAs.combine(TypeAs.UNWRAP_ARRAY_OF, TypeAs.UNWRAP_COLLECTION_OF, TypeAs.UNWRAP_OPTIONAL_OF).apply(typeRef); } else if (builder.getAttributes().containsKey(DESCENDANTS) && !((Collection)builder.getAttributes().get(DESCENDANTS)).isEmpty()) { hasDescendants = true; ClassRef listRef = Collections.ARRAY_LIST.toReference(targetType); builder.addToAttributes(LAZY_INIT, "new " + listRef + "()") .addToAttributes(INIT , builder.getAttributes().containsKey(LAZY_COLLECTIONS_INIT_ENABLED) && (Boolean) builder.getAttributes().get(LAZY_COLLECTIONS_INIT_ENABLED) ? null : builder.getAttributes().get(LAZY_INIT)) .addToAttributes(INIT_FUNCTION, new Construct(Collections.ARRAY_LIST, targetType)) .addToAttributes(ALSO_IMPORT, Arrays.asList(targetType, listRef)); ClassRef setRef = Collections.LINKED_HASH_SET.toReference(unwrapped); builder.addToAttributes(LAZY_INIT, "new " + setRef + "()") .addToAttributes(INIT , builder.getAttributes().containsKey(LAZY_COLLECTIONS_INIT_ENABLED) && (Boolean) builder.getAttributes().get(LAZY_COLLECTIONS_INIT_ENABLED) ? null : builder.getAttributes().get(LAZY_INIT)) .addToAttributes(INIT_FUNCTION, new Construct(Collections.LINKED_HASH_SET, unwrapped)) .addToAttributes(ALSO_IMPORT, Arrays.asList(targetType, setRef)); ClassRef mapRef = Collections.LINKED_HASH_MAP.toReference(arguments); builder.addToAttributes(LAZY_INIT, "new " + mapRef + "()") .addToAttributes(INIT , builder.getAttributes().containsKey(LAZY_COLLECTIONS_INIT_ENABLED) && (Boolean) builder.getAttributes().get(LAZY_COLLECTIONS_INIT_ENABLED) ? null : builder.getAttributes().get(LAZY_INIT)) .addToAttributes(INIT_FUNCTION, new Construct(Collections.LINKED_HASH_MAP, arguments)) .addToAttributes(ALSO_IMPORT, Arrays.asList(targetType, mapRef));