code: function Model(name, referenceModel, modellingElements, transitive) {
    /** @memberOf Model
     * @member {string} name - The name of the model
     */
    this.__name = name
    _.set(this, ['__jsmf__','conformsTo'], Model)
    _.set(this, ['__jsmf__','uuid'], generateId())
    /** @memberof Model
     * @member {Model} referenceModel - The referenceModel (an empty object if undefined)
     */
    this.referenceModel = referenceModel || {}
    /** @memberof Model
     * @member {Object} modellingElements - The objects of the model, classified by their class name
     */
    this.modellingElements = {}
    /** @memberOf Model
     * @member {Object} classes - classes and enums of the model, classified by their name
     */
    this.classes = {}
    if (modellingElements !== undefined) {
      modellingElements = _.isArray(modellingElements) ?  modellingElements : [modellingElements]
      if (transitive) {
        modellingElements = crawlElements(modellingElements)
      }
      _.forEach(modellingElements, e => this.addModellingElement(e))
    }
  }
docs: A Model is basically a set of elements
  @constructor
  @param {string} name - The model name
  @param {Model} referenceModel - The reference model (indicative and used for conformance)
  @param {Class~ClassInstance[]} modellingElements - Either an element or an array of elements that
  should be included in the model
  @param {boolean} transitive - If false, only the elements in modellingElements will be in the model,
  otherwise all theelements that can be reach from modellingElements
  references are included in the model