docs: function addAssociation(associationDetails) {
    var _this6 = this;
  
    var association = {
      parent: this,
      type: associationDetails.type,
      constructor: associationDetails.constructor
    };
  
    /* Default Values */
  
    switch (associationDetails.type) {
      case "hasOne":
      case "hasMany":
        association.foreignKey = (0, _jargon2["default"])(this.constructor.name).foreignKey.toString();
        association.foreignId = (0, _jargon2["default"])(association.foreignKey).camel.toString();
        break;
      case "belongsTo":
        association.foreignKey = (0, _jargon2["default"])(associationDetails.name).foreignKey.toString();
        association.foreignId = (0, _jargon2["default"])(association.foreignKey).camel.toString();
    }
  
    // TODO: AS
    association.foreignName = (0, _jargon2["default"])(this.constructor.name).camel.toString();
  
    /* Override Values */
  
    var associationSetter = new _associationSetterJs2["default"](association);
  
    /* Set private space for value to be stored internally */
  
    var privateAssociationName = "_" + associationDetails.name;
  
    var implicitAssociationName = associationDetails.name + "Id";
    var privateImplicitAssociationName = "_" + implicitAssociationName;
  
    /* Association Setter By Type */
  
    var setterFunction = undefined,
        implicitSetterFunction = undefined;
  
    setterFunction = getSetterFunctionByAssociationType[associationDetails.type].call(this, association, privateAssociationName, privateImplicitAssociationName);
    implicitSetterFunction = getImplicitSetterFunctionByAssociationType[associationDetails.type].call(this, association, privateAssociationName, privateImplicitAssociationName);
  
    var newProperties = {};
    newProperties[privateAssociationName] = {
      enumerable: false,
      writable: true
    };
    newProperties[associationDetails.name] = {
      enumerable: true,
      set: setterFunction,
      get: function get() {
        return _this6[privateAssociationName];
      }
    };
    if (implicitSetterFunction) {
      newProperties[privateImplicitAssociationName] = {
        enumerable: false,
        writable: true
      };
      newProperties[implicitAssociationName] = {
        enumerable: true,
        set: implicitSetterFunction,
        get: function get() {
          return _this6[privateImplicitAssociationName];
        }
      };
    }
    Object.defineProperties(this, newProperties);
  
    // Object.defineProperty(
    // 	this,
    // 	privateAssociationName,
    // 	{
    // 		enumerable: false,
    // 		writable: true
    // 	}
    // );
  
    // Object.defineProperty(
    // 	this,
    // 	associationDetails.name,
    // 	{
    // 		enumerable: true,
    // 		set: setterFunction,
    // 		get: () => {
    // 			return this[privateAssociationName];
    // 		}
    // 	}
    // );
  
    this[associationDetails.name] = associationDetails.value;
  
    (0, _incognito2["default"])(this).associations[associationDetails.name] = association;
  
    return associationSetter;
  }