docs: private JDefinedClass createClass(String nodeName, JsonNode node, JPackage _package) throws ClassAlreadyExistsException {
  
          JDefinedClass newType;
  
          Annotator annotator = ruleFactory.getAnnotator();
  
          try {
              if (node.has("existingJavaType")) {
                  String fqn = substringBefore(node.get("existingJavaType").asText(), "<");
  
                  if (isPrimitive(fqn, _package.owner())) {
                      throw new ClassAlreadyExistsException(primitiveType(fqn, _package.owner()));
                  }
  
                  JClass existingClass = resolveType(_package, fqn + (node.get("existingJavaType").asText().contains("<") ? "<" + substringAfter(node.get("existingJavaType").asText(), "<") : ""));
                  throw new ClassAlreadyExistsException(existingClass);
              }
  
              boolean usePolymorphicDeserialization = annotator.isPolymorphicDeserializationSupported(node);
  
              if (node.has("javaType")) {
                  String fqn = node.path("javaType").asText();
  
                  if (isPrimitive(fqn, _package.owner())) {
                      throw new GenerationException("javaType cannot refer to a primitive type (" + fqn + "), did you mean to use existingJavaType?");
                  }
  
                  if (fqn.contains("<")) {
                      throw new GenerationException("javaType does not support generic args (" + fqn + "), did you mean to use existingJavaType?");
                  }
  
                  int index = fqn.lastIndexOf(".") + 1;
                  if (index >= 0 && index < fqn.length()) {
                      fqn = fqn.substring(0, index) + ruleFactory.getGenerationConfig().getClassNamePrefix() + fqn.substring(index) + ruleFactory.getGenerationConfig().getClassNameSuffix();
                  }
  
                  if (usePolymorphicDeserialization) {
                      newType = _package.owner()._class(JMod.PUBLIC, fqn, ClassType.CLASS);
                  } else {
                      newType = _package.owner()._class(fqn);
                  }
              } else {
                  if (usePolymorphicDeserialization) {
                      newType = _package._class(JMod.PUBLIC, ruleFactory.getNameHelper().getUniqueClassName(nodeName, node, _package), ClassType.CLASS);
                  } else {
                      newType = _package._class(ruleFactory.getNameHelper().getUniqueClassName(nodeName, node, _package));
                  }
              }
          } catch (JClassAlreadyExistsException e) {
              throw new ClassAlreadyExistsException(e.getExistingClass());
          }
  
          annotator.typeInfo(newType, node);
          annotator.propertyInclusion(newType, node);
  
          return newType;
  
      }