text: /**
   * @name exports
   * @summary MedicationStatement Class
   */
  module.exports = class MedicationStatement {
  	constructor(opts) {
  		// Create an object to store all props
  		Object.defineProperty(this, '__data', { value: {} });
  
  		// Define getters and setters as enumerable
  
  		Object.defineProperty(this, '_id', {
  			enumerable: true,
  			get: () => this.__data._id,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._id = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'id', {
  			enumerable: true,
  			get: () => this.__data.id,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.id = value;
  			},
  		});
  
  		Object.defineProperty(this, 'meta', {
  			enumerable: true,
  			get: () => this.__data.meta,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Meta = require('./meta.js');
  				this.__data.meta = new Meta(value);
  			},
  		});
  
  		Object.defineProperty(this, '_implicitRules', {
  			enumerable: true,
  			get: () => this.__data._implicitRules,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._implicitRules = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'implicitRules', {
  			enumerable: true,
  			get: () => this.__data.implicitRules,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.implicitRules = value;
  			},
  		});
  
  		Object.defineProperty(this, '_language', {
  			enumerable: true,
  			get: () => this.__data._language,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._language = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'language', {
  			enumerable: true,
  			get: () => this.__data.language,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.language = value;
  			},
  		});
  
  		Object.defineProperty(this, 'text', {
  			enumerable: true,
  			get: () => this.__data.text,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Narrative = require('./narrative.js');
  				this.__data.text = new Narrative(value);
  			},
  		});
  
  		Object.defineProperty(this, 'contained', {
  			enumerable: true,
  			get: () => this.__data.contained,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.contained = Array.isArray(value) ? value.map(v => v) : [value];
  			},
  		});
  
  		Object.defineProperty(this, 'extension', {
  			enumerable: true,
  			get: () => this.__data.extension,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Extension = require('./extension.js');
  				this.__data.extension = Array.isArray(value) ? value.map(v => new Extension(v)) : [new Extension(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'modifierExtension', {
  			enumerable: true,
  			get: () => this.__data.modifierExtension,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Extension = require('./extension.js');
  				this.__data.modifierExtension = Array.isArray(value)
  					? value.map(v => new Extension(v))
  					: [new Extension(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'identifier', {
  			enumerable: true,
  			get: () => this.__data.identifier,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Identifier = require('./identifier.js');
  				this.__data.identifier = Array.isArray(value) ? value.map(v => new Identifier(v)) : [new Identifier(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'basedOn', {
  			enumerable: true,
  			get: () => this.__data.basedOn,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.basedOn = Array.isArray(value) ? value.map(v => new Reference(v)) : [new Reference(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'partOf', {
  			enumerable: true,
  			get: () => this.__data.partOf,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.partOf = Array.isArray(value) ? value.map(v => new Reference(v)) : [new Reference(value)];
  			},
  		});
  
  		Object.defineProperty(this, '_status', {
  			enumerable: true,
  			get: () => this.__data._status,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._status = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'status', {
  			enumerable: true,
  			get: () => this.__data.status,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.status = value;
  			},
  		});
  
  		Object.defineProperty(this, 'statusReason', {
  			enumerable: true,
  			get: () => this.__data.statusReason,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let CodeableConcept = require('./codeableconcept.js');
  				this.__data.statusReason = Array.isArray(value)
  					? value.map(v => new CodeableConcept(v))
  					: [new CodeableConcept(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'category', {
  			enumerable: true,
  			get: () => this.__data.category,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let CodeableConcept = require('./codeableconcept.js');
  				this.__data.category = new CodeableConcept(value);
  			},
  		});
  
  		Object.defineProperty(this, 'medicationCodeableConcept', {
  			enumerable: true,
  			get: () => this.__data.medicationCodeableConcept,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let CodeableConcept = require('./codeableconcept.js');
  				this.__data.medicationCodeableConcept = new CodeableConcept(value);
  			},
  		});
  
  		Object.defineProperty(this, 'medicationReference', {
  			enumerable: true,
  			get: () => this.__data.medicationReference,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.medicationReference = new Reference(value);
  			},
  		});
  
  		Object.defineProperty(this, 'subject', {
  			enumerable: true,
  			get: () => this.__data.subject,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.subject = new Reference(value);
  			},
  		});
  
  		Object.defineProperty(this, 'context', {
  			enumerable: true,
  			get: () => this.__data.context,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.context = new Reference(value);
  			},
  		});
  
  		Object.defineProperty(this, '_effectiveDateTime', {
  			enumerable: true,
  			get: () => this.__data._effectiveDateTime,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._effectiveDateTime = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'effectiveDateTime', {
  			enumerable: true,
  			get: () => this.__data.effectiveDateTime,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.effectiveDateTime = value;
  			},
  		});
  
  		Object.defineProperty(this, 'effectivePeriod', {
  			enumerable: true,
  			get: () => this.__data.effectivePeriod,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Period = require('./period.js');
  				this.__data.effectivePeriod = new Period(value);
  			},
  		});
  
  		Object.defineProperty(this, '_dateAsserted', {
  			enumerable: true,
  			get: () => this.__data._dateAsserted,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Element = require('./element.js');
  				this.__data._dateAsserted = new Element(value);
  			},
  		});
  
  		Object.defineProperty(this, 'dateAsserted', {
  			enumerable: true,
  			get: () => this.__data.dateAsserted,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				this.__data.dateAsserted = value;
  			},
  		});
  
  		Object.defineProperty(this, 'informationSource', {
  			enumerable: true,
  			get: () => this.__data.informationSource,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.informationSource = new Reference(value);
  			},
  		});
  
  		Object.defineProperty(this, 'derivedFrom', {
  			enumerable: true,
  			get: () => this.__data.derivedFrom,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.derivedFrom = Array.isArray(value) ? value.map(v => new Reference(v)) : [new Reference(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'reasonCode', {
  			enumerable: true,
  			get: () => this.__data.reasonCode,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let CodeableConcept = require('./codeableconcept.js');
  				this.__data.reasonCode = Array.isArray(value)
  					? value.map(v => new CodeableConcept(v))
  					: [new CodeableConcept(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'reasonReference', {
  			enumerable: true,
  			get: () => this.__data.reasonReference,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Reference = require('./reference.js');
  				this.__data.reasonReference = Array.isArray(value) ? value.map(v => new Reference(v)) : [new Reference(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'note', {
  			enumerable: true,
  			get: () => this.__data.note,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Annotation = require('./annotation.js');
  				this.__data.note = Array.isArray(value) ? value.map(v => new Annotation(v)) : [new Annotation(value)];
  			},
  		});
  
  		Object.defineProperty(this, 'dosage', {
  			enumerable: true,
  			get: () => this.__data.dosage,
  			set: value => {
  				if (value === undefined || value === null) {
  					return;
  				}
  
  				let Dosage = require('./dosage.js');
  				this.__data.dosage = Array.isArray(value) ? value.map(v => new Dosage(v)) : [new Dosage(value)];
  			},
  		});
  
  		// Merge in any defaults
  		Object.assign(this, opts);
  
  		// Define a default non-writable resourceType property
  		Object.defineProperty(this, 'resourceType', {
  			value: 'MedicationStatement',
  			enumerable: true,
  			writable: false,
  		});
  	}
  
  	static get resourceType() {
  		return 'MedicationStatement';
  	}
  
  	toJSON() {
  		return {
  			resourceType: this.resourceType,
  			_id: this._id && this._id.toJSON(),
  			id: this.id,
  			meta: this.meta && this.meta.toJSON(),
  			_implicitRules: this._implicitRules && this._implicitRules.toJSON(),
  			implicitRules: this.implicitRules,
  			_language: this._language && this._language.toJSON(),
  			language: this.language,
  			text: this.text && this.text.toJSON(),
  			contained: this.contained,
  			extension: this.extension && this.extension.map(v => v.toJSON()),
  			modifierExtension: this.modifierExtension && this.modifierExtension.map(v => v.toJSON()),
  			identifier: this.identifier && this.identifier.map(v => v.toJSON()),
  			basedOn: this.basedOn && this.basedOn.map(v => v.toJSON()),
  			partOf: this.partOf && this.partOf.map(v => v.toJSON()),
  			_status: this._status && this._status.toJSON(),
  			status: this.status,
  			statusReason: this.statusReason && this.statusReason.map(v => v.toJSON()),
  			category: this.category && this.category.toJSON(),
  			medicationCodeableConcept: this.medicationCodeableConcept && this.medicationCodeableConcept.toJSON(),
  			medicationReference: this.medicationReference && this.medicationReference.toJSON(),
  			subject: this.subject && this.subject.toJSON(),
  			context: this.context && this.context.toJSON(),
  			_effectiveDateTime: this._effectiveDateTime && this._effectiveDateTime.toJSON(),
  			effectiveDateTime: this.effectiveDateTime,
  			effectivePeriod: this.effectivePeriod && this.effectivePeriod.toJSON(),
  			_dateAsserted: this._dateAsserted && this._dateAsserted.toJSON(),
  			dateAsserted: this.dateAsserted,
  			informationSource: this.informationSource && this.informationSource.toJSON(),
  			derivedFrom: this.derivedFrom && this.derivedFrom.map(v => v.toJSON()),
  			reasonCode: this.reasonCode && this.reasonCode.map(v => v.toJSON()),
  			reasonReference: this.reasonReference && this.reasonReference.map(v => v.toJSON()),
  			note: this.note && this.note.map(v => v.toJSON()),
  			dosage: this.dosage && this.dosage.map(v => v.toJSON()),
  		};
  	}
  };
  