code: function ComplexType(config) {
      if (arguments.length > 1) {
        throw new Error("The ComplexType ctor has a single argument that is a configuration object.");
      }
  
      assertConfig(config)
          .whereParam("shortName").isNonEmptyString()
          .whereParam("namespace").isString().isOptional().withDefault("")
          .whereParam("dataProperties").isOptional()
          .whereParam("isComplexType").isOptional().isBoolean()   // needed because this ctor can get called from the addEntityType method which needs the isComplexType prop
          .whereParam("custom").isOptional()
          .applyAll(this);
  
      this.name = qualifyTypeName(this.shortName, this.namespace);
      this.isComplexType = true;
      this.dataProperties = [];
      this.complexProperties = [];
      this.validators = [];
      this.concurrencyProperties = [];
      this.unmappedProperties = [];
      this.navigationProperties = []; // not yet supported
      this.keyProperties = []; // may be used later to enforce uniqueness on arrays of complextypes.
  
      addProperties(this, config.dataProperties, DataProperty);
    }
docs: Container for all of the metadata about a specific type of Complex object.
  @class ComplexType
   
  @example
  var complexType = new ComplexType( {
  shortName: "address",
  namespace: "myAppNamespace"
  });
  @method <ctor> ComplexType
  @param config {Object} Configuration settings
  @param config.shortName {String}
  @param [config.namespace=""] {String}
  @param [config.dataProperties] {Array of DataProperties}
  @param [config.custom] {Object}