code: public ClassModel<T> build() {
          List<PropertyModel<?>> propertyModels = new ArrayList<PropertyModel<?>>();
          PropertyModel<?> idPropertyModel = null;
  
          stateNotNull("type", type);
          for (Convention convention : conventions) {
              convention.apply(this);
          }
  
          stateNotNull("instanceCreatorFactory", instanceCreatorFactory);
          if (discriminatorEnabled) {
              stateNotNull("discriminatorKey", discriminatorKey);
              stateNotNull("discriminator", discriminator);
          }
  
          for (PropertyModelBuilder<?> propertyModelBuilder : propertyModelBuilders) {
              boolean isIdProperty = propertyModelBuilder.getName().equals(idPropertyName);
              if (isIdProperty) {
                  propertyModelBuilder.readName(ID_PROPERTY_NAME).writeName(ID_PROPERTY_NAME);
              }
  
              PropertyModel<?> model = propertyModelBuilder.build();
              propertyModels.add(model);
              if (isIdProperty) {
                  idPropertyModel = model;
              }
          }
          validatePropertyModels(type.getSimpleName(), propertyModels);
          return new ClassModel<T>(type, propertyNameToTypeParameterMap, instanceCreatorFactory, discriminatorEnabled, discriminatorKey,
                  discriminator, IdPropertyModelHolder.create(type, idPropertyModel, idGenerator), unmodifiableList(propertyModels));
      }
docs: Creates a new ClassModel instance based on the mapping data provided.
  
  @return the new instance