docs: private LinkedHashSet<String> getConstructorProperties(JsonNode node, boolean onlyRequired) {
  
      if (!node.has("properties")) {
        return new LinkedHashSet<>();
      }
  
      LinkedHashSet<String> rtn = new LinkedHashSet<>();
      Set<String> draft4RequiredProperties = new HashSet<>();
  
      // setup the set of required properties for draft4 style "required"
      if (onlyRequired && node.has("required")) {
        JsonNode requiredArray = node.get("required");
        if (requiredArray.isArray()) {
          for (JsonNode requiredEntry : requiredArray) {
            if (requiredEntry.isTextual()) {
              draft4RequiredProperties.add(requiredEntry.asText());
            }
          }
        }
      }
  
      NameHelper nameHelper = ruleFactory.getNameHelper();
      for (Iterator<Entry<String, JsonNode>> properties = node.get("properties").fields(); properties.hasNext(); ) {
        Map.Entry<String, JsonNode> property = properties.next();
  
        JsonNode propertyObj = property.getValue();
        if (onlyRequired) {
          // draft3 style
          if (propertyObj.has("required") && propertyObj.get("required").asBoolean()) {
            rtn.add(nameHelper.getPropertyName(property.getKey(), property.getValue()));
          }
  
          // draft4 style
          if (draft4RequiredProperties.contains(property.getKey())) {
            rtn.add(nameHelper.getPropertyName(property.getKey(), property.getValue()));
          }
        } else {
          rtn.add(nameHelper.getPropertyName(property.getKey(), property.getValue()));
        }
      }
      return rtn;
    }