/** Invoked by transformed DSL creation rules */
 public <T> void create(String modelPathString, Class<T> type, Closure<?> closure) {
   SourceLocation sourceLocation = ruleLocationExtractor.transform(closure);
   ModelPath modelPath = ModelPath.path(modelPathString);
   ModelRuleDescriptor descriptor = toDescriptor(sourceLocation, modelPath);
   try {
     NodeInitializerRegistry nodeInitializerRegistry =
         modelRegistry.realize(
             DefaultNodeInitializerRegistry.DEFAULT_REFERENCE.getPath(),
             DefaultNodeInitializerRegistry.DEFAULT_REFERENCE.getType());
     NodeInitializer nodeInitializer =
         nodeInitializerRegistry.getNodeInitializer(ModelType.of(type));
     modelRegistry.create(
         ModelCreators.of(modelPath, nodeInitializer).descriptor(descriptor).build());
   } catch (ModelTypeInitializationException e) {
     throw new InvalidModelRuleDeclarationException(descriptor, e);
   }
   registerAction(modelPath, type, descriptor, ModelActionRole.Initialize, closure);
 }
 private static <P> ModelRegistrations.Builder managedRegistrationBuilder(
     ModelPath childPath,
     ManagedProperty<P> property,
     NodeInitializerRegistry nodeInitializerRegistry,
     ModelType<?> publicType) {
   return ModelRegistrations.of(
       childPath,
       nodeInitializerRegistry.getNodeInitializer(
           forProperty(property.getType(), property, publicType)));
 }
 private <P> void validateProperty(
     ModelSchema<P> propertySchema,
     ManagedProperty<P> property,
     NodeInitializerRegistry nodeInitializerRegistry) {
   if (propertySchema instanceof ManagedImplSchema) {
     if (!property.isWritable()) {
       if (isCollectionOfManagedTypes(propertySchema)) {
         CollectionSchema<P, ?> propertyCollectionsSchema =
             (CollectionSchema<P, ?>) propertySchema;
         ModelType<?> elementType = propertyCollectionsSchema.getElementType();
         nodeInitializerRegistry.ensureHasInitializer(
             forProperty(elementType, property, bindings.getPublicSchema().getType()));
       }
       if (property.isDeclaredAsHavingUnmanagedType()) {
         throw new UnmanagedPropertyMissingSetterException(property.getName());
       }
     }
   } else if (!shouldHaveANodeInitializer(property, propertySchema)
       && !property.isWritable()
       && !isNamePropertyOfANamedType(property)) {
     throw new ReadonlyImmutableManagedPropertyException(
         bindings.getPublicSchema().getType(), property.getName(), property.getType());
   }
 }