001package org.hl7.fhir.r5.model;
002
003
004/*
005  Copyright (c) 2011+, HL7, Inc.
006  All rights reserved.
007  
008  Redistribution and use in source and binary forms, with or without modification, \
009  are permitted provided that the following conditions are met:
010  
011   * Redistributions of source code must retain the above copyright notice, this \
012     list of conditions and the following disclaimer.
013   * Redistributions in binary form must reproduce the above copyright notice, \
014     this list of conditions and the following disclaimer in the documentation \
015     and/or other materials provided with the distribution.
016   * Neither the name of HL7 nor the names of its contributors may be used to 
017     endorse or promote products derived from this software without specific 
018     prior written permission.
019  
020  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND \
021  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED \
022  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. \
023  IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, \
024  INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT \
025  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR \
026  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \
027  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) \
028  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE \
029  POSSIBILITY OF SUCH DAMAGE.
030  */
031
032// Generated on Thu, Mar 23, 2023 19:59+1100 for FHIR v5.0.0
033
034import java.util.ArrayList;
035import java.util.Date;
036import java.util.List;
037import org.hl7.fhir.utilities.Utilities;
038import org.hl7.fhir.r5.model.Enumerations.*;
039import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
040import org.hl7.fhir.exceptions.FHIRException;
041import org.hl7.fhir.instance.model.api.ICompositeType;
042import ca.uhn.fhir.model.api.annotation.ResourceDef;
043import ca.uhn.fhir.model.api.annotation.SearchParamDefinition;
044import org.hl7.fhir.instance.model.api.IBaseBackboneElement;
045import ca.uhn.fhir.model.api.annotation.Child;
046import ca.uhn.fhir.model.api.annotation.ChildOrder;
047import ca.uhn.fhir.model.api.annotation.Description;
048import ca.uhn.fhir.model.api.annotation.Block;
049
050/**
051 * This resource allows for the definition of various types of plans as a sharable, consumable, and executable artifact. The resource is general enough to support the description of a broad range of clinical and non-clinical artifacts such as clinical decision support rules, order sets, protocols, and drug quality specifications.
052 */
053@ResourceDef(name="PlanDefinition", profile="http://hl7.org/fhir/StructureDefinition/PlanDefinition")
054public class PlanDefinition extends MetadataResource {
055
056    @Block()
057    public static class PlanDefinitionGoalComponent extends BackboneElement implements IBaseBackboneElement {
058        /**
059         * Indicates a category the goal falls within.
060         */
061        @Child(name = "category", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=false)
062        @Description(shortDefinition="E.g. Treatment, dietary, behavioral", formalDefinition="Indicates a category the goal falls within." )
063        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/goal-category")
064        protected CodeableConcept category;
065
066        /**
067         * Human-readable and/or coded description of a specific desired objective of care, such as "control blood pressure" or "negotiate an obstacle course" or "dance with child at wedding".
068         */
069        @Child(name = "description", type = {CodeableConcept.class}, order=2, min=1, max=1, modifier=false, summary=false)
070        @Description(shortDefinition="Code or text describing the goal", formalDefinition="Human-readable and/or coded description of a specific desired objective of care, such as \"control blood pressure\" or \"negotiate an obstacle course\" or \"dance with child at wedding\"." )
071        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/clinical-findings")
072        protected CodeableConcept description;
073
074        /**
075         * Identifies the expected level of importance associated with reaching/sustaining the defined goal.
076         */
077        @Child(name = "priority", type = {CodeableConcept.class}, order=3, min=0, max=1, modifier=false, summary=false)
078        @Description(shortDefinition="high-priority | medium-priority | low-priority", formalDefinition="Identifies the expected level of importance associated with reaching/sustaining the defined goal." )
079        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/goal-priority")
080        protected CodeableConcept priority;
081
082        /**
083         * The event after which the goal should begin being pursued.
084         */
085        @Child(name = "start", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
086        @Description(shortDefinition="When goal pursuit begins", formalDefinition="The event after which the goal should begin being pursued." )
087        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/goal-start-event")
088        protected CodeableConcept start;
089
090        /**
091         * Identifies problems, conditions, issues, or concerns the goal is intended to address.
092         */
093        @Child(name = "addresses", type = {CodeableConcept.class}, order=5, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
094        @Description(shortDefinition="What does the goal address", formalDefinition="Identifies problems, conditions, issues, or concerns the goal is intended to address." )
095        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/condition-code")
096        protected List<CodeableConcept> addresses;
097
098        /**
099         * Didactic or other informational resources associated with the goal that provide further supporting information about the goal. Information resources can include inline text commentary and links to web resources.
100         */
101        @Child(name = "documentation", type = {RelatedArtifact.class}, order=6, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
102        @Description(shortDefinition="Supporting documentation for the goal", formalDefinition="Didactic or other informational resources associated with the goal that provide further supporting information about the goal. Information resources can include inline text commentary and links to web resources." )
103        protected List<RelatedArtifact> documentation;
104
105        /**
106         * Indicates what should be done and within what timeframe.
107         */
108        @Child(name = "target", type = {}, order=7, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
109        @Description(shortDefinition="Target outcome for the goal", formalDefinition="Indicates what should be done and within what timeframe." )
110        protected List<PlanDefinitionGoalTargetComponent> target;
111
112        private static final long serialVersionUID = -795308926L;
113
114    /**
115     * Constructor
116     */
117      public PlanDefinitionGoalComponent() {
118        super();
119      }
120
121    /**
122     * Constructor
123     */
124      public PlanDefinitionGoalComponent(CodeableConcept description) {
125        super();
126        this.setDescription(description);
127      }
128
129        /**
130         * @return {@link #category} (Indicates a category the goal falls within.)
131         */
132        public CodeableConcept getCategory() { 
133          if (this.category == null)
134            if (Configuration.errorOnAutoCreate())
135              throw new Error("Attempt to auto-create PlanDefinitionGoalComponent.category");
136            else if (Configuration.doAutoCreate())
137              this.category = new CodeableConcept(); // cc
138          return this.category;
139        }
140
141        public boolean hasCategory() { 
142          return this.category != null && !this.category.isEmpty();
143        }
144
145        /**
146         * @param value {@link #category} (Indicates a category the goal falls within.)
147         */
148        public PlanDefinitionGoalComponent setCategory(CodeableConcept value) { 
149          this.category = value;
150          return this;
151        }
152
153        /**
154         * @return {@link #description} (Human-readable and/or coded description of a specific desired objective of care, such as "control blood pressure" or "negotiate an obstacle course" or "dance with child at wedding".)
155         */
156        public CodeableConcept getDescription() { 
157          if (this.description == null)
158            if (Configuration.errorOnAutoCreate())
159              throw new Error("Attempt to auto-create PlanDefinitionGoalComponent.description");
160            else if (Configuration.doAutoCreate())
161              this.description = new CodeableConcept(); // cc
162          return this.description;
163        }
164
165        public boolean hasDescription() { 
166          return this.description != null && !this.description.isEmpty();
167        }
168
169        /**
170         * @param value {@link #description} (Human-readable and/or coded description of a specific desired objective of care, such as "control blood pressure" or "negotiate an obstacle course" or "dance with child at wedding".)
171         */
172        public PlanDefinitionGoalComponent setDescription(CodeableConcept value) { 
173          this.description = value;
174          return this;
175        }
176
177        /**
178         * @return {@link #priority} (Identifies the expected level of importance associated with reaching/sustaining the defined goal.)
179         */
180        public CodeableConcept getPriority() { 
181          if (this.priority == null)
182            if (Configuration.errorOnAutoCreate())
183              throw new Error("Attempt to auto-create PlanDefinitionGoalComponent.priority");
184            else if (Configuration.doAutoCreate())
185              this.priority = new CodeableConcept(); // cc
186          return this.priority;
187        }
188
189        public boolean hasPriority() { 
190          return this.priority != null && !this.priority.isEmpty();
191        }
192
193        /**
194         * @param value {@link #priority} (Identifies the expected level of importance associated with reaching/sustaining the defined goal.)
195         */
196        public PlanDefinitionGoalComponent setPriority(CodeableConcept value) { 
197          this.priority = value;
198          return this;
199        }
200
201        /**
202         * @return {@link #start} (The event after which the goal should begin being pursued.)
203         */
204        public CodeableConcept getStart() { 
205          if (this.start == null)
206            if (Configuration.errorOnAutoCreate())
207              throw new Error("Attempt to auto-create PlanDefinitionGoalComponent.start");
208            else if (Configuration.doAutoCreate())
209              this.start = new CodeableConcept(); // cc
210          return this.start;
211        }
212
213        public boolean hasStart() { 
214          return this.start != null && !this.start.isEmpty();
215        }
216
217        /**
218         * @param value {@link #start} (The event after which the goal should begin being pursued.)
219         */
220        public PlanDefinitionGoalComponent setStart(CodeableConcept value) { 
221          this.start = value;
222          return this;
223        }
224
225        /**
226         * @return {@link #addresses} (Identifies problems, conditions, issues, or concerns the goal is intended to address.)
227         */
228        public List<CodeableConcept> getAddresses() { 
229          if (this.addresses == null)
230            this.addresses = new ArrayList<CodeableConcept>();
231          return this.addresses;
232        }
233
234        /**
235         * @return Returns a reference to <code>this</code> for easy method chaining
236         */
237        public PlanDefinitionGoalComponent setAddresses(List<CodeableConcept> theAddresses) { 
238          this.addresses = theAddresses;
239          return this;
240        }
241
242        public boolean hasAddresses() { 
243          if (this.addresses == null)
244            return false;
245          for (CodeableConcept item : this.addresses)
246            if (!item.isEmpty())
247              return true;
248          return false;
249        }
250
251        public CodeableConcept addAddresses() { //3
252          CodeableConcept t = new CodeableConcept();
253          if (this.addresses == null)
254            this.addresses = new ArrayList<CodeableConcept>();
255          this.addresses.add(t);
256          return t;
257        }
258
259        public PlanDefinitionGoalComponent addAddresses(CodeableConcept t) { //3
260          if (t == null)
261            return this;
262          if (this.addresses == null)
263            this.addresses = new ArrayList<CodeableConcept>();
264          this.addresses.add(t);
265          return this;
266        }
267
268        /**
269         * @return The first repetition of repeating field {@link #addresses}, creating it if it does not already exist {3}
270         */
271        public CodeableConcept getAddressesFirstRep() { 
272          if (getAddresses().isEmpty()) {
273            addAddresses();
274          }
275          return getAddresses().get(0);
276        }
277
278        /**
279         * @return {@link #documentation} (Didactic or other informational resources associated with the goal that provide further supporting information about the goal. Information resources can include inline text commentary and links to web resources.)
280         */
281        public List<RelatedArtifact> getDocumentation() { 
282          if (this.documentation == null)
283            this.documentation = new ArrayList<RelatedArtifact>();
284          return this.documentation;
285        }
286
287        /**
288         * @return Returns a reference to <code>this</code> for easy method chaining
289         */
290        public PlanDefinitionGoalComponent setDocumentation(List<RelatedArtifact> theDocumentation) { 
291          this.documentation = theDocumentation;
292          return this;
293        }
294
295        public boolean hasDocumentation() { 
296          if (this.documentation == null)
297            return false;
298          for (RelatedArtifact item : this.documentation)
299            if (!item.isEmpty())
300              return true;
301          return false;
302        }
303
304        public RelatedArtifact addDocumentation() { //3
305          RelatedArtifact t = new RelatedArtifact();
306          if (this.documentation == null)
307            this.documentation = new ArrayList<RelatedArtifact>();
308          this.documentation.add(t);
309          return t;
310        }
311
312        public PlanDefinitionGoalComponent addDocumentation(RelatedArtifact t) { //3
313          if (t == null)
314            return this;
315          if (this.documentation == null)
316            this.documentation = new ArrayList<RelatedArtifact>();
317          this.documentation.add(t);
318          return this;
319        }
320
321        /**
322         * @return The first repetition of repeating field {@link #documentation}, creating it if it does not already exist {3}
323         */
324        public RelatedArtifact getDocumentationFirstRep() { 
325          if (getDocumentation().isEmpty()) {
326            addDocumentation();
327          }
328          return getDocumentation().get(0);
329        }
330
331        /**
332         * @return {@link #target} (Indicates what should be done and within what timeframe.)
333         */
334        public List<PlanDefinitionGoalTargetComponent> getTarget() { 
335          if (this.target == null)
336            this.target = new ArrayList<PlanDefinitionGoalTargetComponent>();
337          return this.target;
338        }
339
340        /**
341         * @return Returns a reference to <code>this</code> for easy method chaining
342         */
343        public PlanDefinitionGoalComponent setTarget(List<PlanDefinitionGoalTargetComponent> theTarget) { 
344          this.target = theTarget;
345          return this;
346        }
347
348        public boolean hasTarget() { 
349          if (this.target == null)
350            return false;
351          for (PlanDefinitionGoalTargetComponent item : this.target)
352            if (!item.isEmpty())
353              return true;
354          return false;
355        }
356
357        public PlanDefinitionGoalTargetComponent addTarget() { //3
358          PlanDefinitionGoalTargetComponent t = new PlanDefinitionGoalTargetComponent();
359          if (this.target == null)
360            this.target = new ArrayList<PlanDefinitionGoalTargetComponent>();
361          this.target.add(t);
362          return t;
363        }
364
365        public PlanDefinitionGoalComponent addTarget(PlanDefinitionGoalTargetComponent t) { //3
366          if (t == null)
367            return this;
368          if (this.target == null)
369            this.target = new ArrayList<PlanDefinitionGoalTargetComponent>();
370          this.target.add(t);
371          return this;
372        }
373
374        /**
375         * @return The first repetition of repeating field {@link #target}, creating it if it does not already exist {3}
376         */
377        public PlanDefinitionGoalTargetComponent getTargetFirstRep() { 
378          if (getTarget().isEmpty()) {
379            addTarget();
380          }
381          return getTarget().get(0);
382        }
383
384        protected void listChildren(List<Property> children) {
385          super.listChildren(children);
386          children.add(new Property("category", "CodeableConcept", "Indicates a category the goal falls within.", 0, 1, category));
387          children.add(new Property("description", "CodeableConcept", "Human-readable and/or coded description of a specific desired objective of care, such as \"control blood pressure\" or \"negotiate an obstacle course\" or \"dance with child at wedding\".", 0, 1, description));
388          children.add(new Property("priority", "CodeableConcept", "Identifies the expected level of importance associated with reaching/sustaining the defined goal.", 0, 1, priority));
389          children.add(new Property("start", "CodeableConcept", "The event after which the goal should begin being pursued.", 0, 1, start));
390          children.add(new Property("addresses", "CodeableConcept", "Identifies problems, conditions, issues, or concerns the goal is intended to address.", 0, java.lang.Integer.MAX_VALUE, addresses));
391          children.add(new Property("documentation", "RelatedArtifact", "Didactic or other informational resources associated with the goal that provide further supporting information about the goal. Information resources can include inline text commentary and links to web resources.", 0, java.lang.Integer.MAX_VALUE, documentation));
392          children.add(new Property("target", "", "Indicates what should be done and within what timeframe.", 0, java.lang.Integer.MAX_VALUE, target));
393        }
394
395        @Override
396        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
397          switch (_hash) {
398          case 50511102: /*category*/  return new Property("category", "CodeableConcept", "Indicates a category the goal falls within.", 0, 1, category);
399          case -1724546052: /*description*/  return new Property("description", "CodeableConcept", "Human-readable and/or coded description of a specific desired objective of care, such as \"control blood pressure\" or \"negotiate an obstacle course\" or \"dance with child at wedding\".", 0, 1, description);
400          case -1165461084: /*priority*/  return new Property("priority", "CodeableConcept", "Identifies the expected level of importance associated with reaching/sustaining the defined goal.", 0, 1, priority);
401          case 109757538: /*start*/  return new Property("start", "CodeableConcept", "The event after which the goal should begin being pursued.", 0, 1, start);
402          case 874544034: /*addresses*/  return new Property("addresses", "CodeableConcept", "Identifies problems, conditions, issues, or concerns the goal is intended to address.", 0, java.lang.Integer.MAX_VALUE, addresses);
403          case 1587405498: /*documentation*/  return new Property("documentation", "RelatedArtifact", "Didactic or other informational resources associated with the goal that provide further supporting information about the goal. Information resources can include inline text commentary and links to web resources.", 0, java.lang.Integer.MAX_VALUE, documentation);
404          case -880905839: /*target*/  return new Property("target", "", "Indicates what should be done and within what timeframe.", 0, java.lang.Integer.MAX_VALUE, target);
405          default: return super.getNamedProperty(_hash, _name, _checkValid);
406          }
407
408        }
409
410      @Override
411      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
412        switch (hash) {
413        case 50511102: /*category*/ return this.category == null ? new Base[0] : new Base[] {this.category}; // CodeableConcept
414        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // CodeableConcept
415        case -1165461084: /*priority*/ return this.priority == null ? new Base[0] : new Base[] {this.priority}; // CodeableConcept
416        case 109757538: /*start*/ return this.start == null ? new Base[0] : new Base[] {this.start}; // CodeableConcept
417        case 874544034: /*addresses*/ return this.addresses == null ? new Base[0] : this.addresses.toArray(new Base[this.addresses.size()]); // CodeableConcept
418        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : this.documentation.toArray(new Base[this.documentation.size()]); // RelatedArtifact
419        case -880905839: /*target*/ return this.target == null ? new Base[0] : this.target.toArray(new Base[this.target.size()]); // PlanDefinitionGoalTargetComponent
420        default: return super.getProperty(hash, name, checkValid);
421        }
422
423      }
424
425      @Override
426      public Base setProperty(int hash, String name, Base value) throws FHIRException {
427        switch (hash) {
428        case 50511102: // category
429          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
430          return value;
431        case -1724546052: // description
432          this.description = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
433          return value;
434        case -1165461084: // priority
435          this.priority = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
436          return value;
437        case 109757538: // start
438          this.start = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
439          return value;
440        case 874544034: // addresses
441          this.getAddresses().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
442          return value;
443        case 1587405498: // documentation
444          this.getDocumentation().add(TypeConvertor.castToRelatedArtifact(value)); // RelatedArtifact
445          return value;
446        case -880905839: // target
447          this.getTarget().add((PlanDefinitionGoalTargetComponent) value); // PlanDefinitionGoalTargetComponent
448          return value;
449        default: return super.setProperty(hash, name, value);
450        }
451
452      }
453
454      @Override
455      public Base setProperty(String name, Base value) throws FHIRException {
456        if (name.equals("category")) {
457          this.category = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
458        } else if (name.equals("description")) {
459          this.description = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
460        } else if (name.equals("priority")) {
461          this.priority = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
462        } else if (name.equals("start")) {
463          this.start = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
464        } else if (name.equals("addresses")) {
465          this.getAddresses().add(TypeConvertor.castToCodeableConcept(value));
466        } else if (name.equals("documentation")) {
467          this.getDocumentation().add(TypeConvertor.castToRelatedArtifact(value));
468        } else if (name.equals("target")) {
469          this.getTarget().add((PlanDefinitionGoalTargetComponent) value);
470        } else
471          return super.setProperty(name, value);
472        return value;
473      }
474
475  @Override
476  public void removeChild(String name, Base value) throws FHIRException {
477        if (name.equals("category")) {
478          this.category = null;
479        } else if (name.equals("description")) {
480          this.description = null;
481        } else if (name.equals("priority")) {
482          this.priority = null;
483        } else if (name.equals("start")) {
484          this.start = null;
485        } else if (name.equals("addresses")) {
486          this.getAddresses().remove(value);
487        } else if (name.equals("documentation")) {
488          this.getDocumentation().remove(value);
489        } else if (name.equals("target")) {
490          this.getTarget().remove((PlanDefinitionGoalTargetComponent) value);
491        } else
492          super.removeChild(name, value);
493        
494      }
495
496      @Override
497      public Base makeProperty(int hash, String name) throws FHIRException {
498        switch (hash) {
499        case 50511102:  return getCategory();
500        case -1724546052:  return getDescription();
501        case -1165461084:  return getPriority();
502        case 109757538:  return getStart();
503        case 874544034:  return addAddresses(); 
504        case 1587405498:  return addDocumentation(); 
505        case -880905839:  return addTarget(); 
506        default: return super.makeProperty(hash, name);
507        }
508
509      }
510
511      @Override
512      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
513        switch (hash) {
514        case 50511102: /*category*/ return new String[] {"CodeableConcept"};
515        case -1724546052: /*description*/ return new String[] {"CodeableConcept"};
516        case -1165461084: /*priority*/ return new String[] {"CodeableConcept"};
517        case 109757538: /*start*/ return new String[] {"CodeableConcept"};
518        case 874544034: /*addresses*/ return new String[] {"CodeableConcept"};
519        case 1587405498: /*documentation*/ return new String[] {"RelatedArtifact"};
520        case -880905839: /*target*/ return new String[] {};
521        default: return super.getTypesForProperty(hash, name);
522        }
523
524      }
525
526      @Override
527      public Base addChild(String name) throws FHIRException {
528        if (name.equals("category")) {
529          this.category = new CodeableConcept();
530          return this.category;
531        }
532        else if (name.equals("description")) {
533          this.description = new CodeableConcept();
534          return this.description;
535        }
536        else if (name.equals("priority")) {
537          this.priority = new CodeableConcept();
538          return this.priority;
539        }
540        else if (name.equals("start")) {
541          this.start = new CodeableConcept();
542          return this.start;
543        }
544        else if (name.equals("addresses")) {
545          return addAddresses();
546        }
547        else if (name.equals("documentation")) {
548          return addDocumentation();
549        }
550        else if (name.equals("target")) {
551          return addTarget();
552        }
553        else
554          return super.addChild(name);
555      }
556
557      public PlanDefinitionGoalComponent copy() {
558        PlanDefinitionGoalComponent dst = new PlanDefinitionGoalComponent();
559        copyValues(dst);
560        return dst;
561      }
562
563      public void copyValues(PlanDefinitionGoalComponent dst) {
564        super.copyValues(dst);
565        dst.category = category == null ? null : category.copy();
566        dst.description = description == null ? null : description.copy();
567        dst.priority = priority == null ? null : priority.copy();
568        dst.start = start == null ? null : start.copy();
569        if (addresses != null) {
570          dst.addresses = new ArrayList<CodeableConcept>();
571          for (CodeableConcept i : addresses)
572            dst.addresses.add(i.copy());
573        };
574        if (documentation != null) {
575          dst.documentation = new ArrayList<RelatedArtifact>();
576          for (RelatedArtifact i : documentation)
577            dst.documentation.add(i.copy());
578        };
579        if (target != null) {
580          dst.target = new ArrayList<PlanDefinitionGoalTargetComponent>();
581          for (PlanDefinitionGoalTargetComponent i : target)
582            dst.target.add(i.copy());
583        };
584      }
585
586      @Override
587      public boolean equalsDeep(Base other_) {
588        if (!super.equalsDeep(other_))
589          return false;
590        if (!(other_ instanceof PlanDefinitionGoalComponent))
591          return false;
592        PlanDefinitionGoalComponent o = (PlanDefinitionGoalComponent) other_;
593        return compareDeep(category, o.category, true) && compareDeep(description, o.description, true)
594           && compareDeep(priority, o.priority, true) && compareDeep(start, o.start, true) && compareDeep(addresses, o.addresses, true)
595           && compareDeep(documentation, o.documentation, true) && compareDeep(target, o.target, true);
596      }
597
598      @Override
599      public boolean equalsShallow(Base other_) {
600        if (!super.equalsShallow(other_))
601          return false;
602        if (!(other_ instanceof PlanDefinitionGoalComponent))
603          return false;
604        PlanDefinitionGoalComponent o = (PlanDefinitionGoalComponent) other_;
605        return true;
606      }
607
608      public boolean isEmpty() {
609        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(category, description, priority
610          , start, addresses, documentation, target);
611      }
612
613  public String fhirType() {
614    return "PlanDefinition.goal";
615
616  }
617
618  }
619
620    @Block()
621    public static class PlanDefinitionGoalTargetComponent extends BackboneElement implements IBaseBackboneElement {
622        /**
623         * The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level.
624         */
625        @Child(name = "measure", type = {CodeableConcept.class}, order=1, min=0, max=1, modifier=false, summary=false)
626        @Description(shortDefinition="The parameter whose value is to be tracked", formalDefinition="The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level." )
627        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/observation-codes")
628        protected CodeableConcept measure;
629
630        /**
631         * The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.
632         */
633        @Child(name = "detail", type = {Quantity.class, Range.class, CodeableConcept.class, StringType.class, BooleanType.class, IntegerType.class, Ratio.class}, order=2, min=0, max=1, modifier=false, summary=false)
634        @Description(shortDefinition="The target value to be achieved", formalDefinition="The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value." )
635        protected DataType detail;
636
637        /**
638         * Indicates the timeframe after the start of the goal in which the goal should be met.
639         */
640        @Child(name = "due", type = {Duration.class}, order=3, min=0, max=1, modifier=false, summary=false)
641        @Description(shortDefinition="Reach goal within", formalDefinition="Indicates the timeframe after the start of the goal in which the goal should be met." )
642        protected Duration due;
643
644        private static final long serialVersionUID = -1464475626L;
645
646    /**
647     * Constructor
648     */
649      public PlanDefinitionGoalTargetComponent() {
650        super();
651      }
652
653        /**
654         * @return {@link #measure} (The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level.)
655         */
656        public CodeableConcept getMeasure() { 
657          if (this.measure == null)
658            if (Configuration.errorOnAutoCreate())
659              throw new Error("Attempt to auto-create PlanDefinitionGoalTargetComponent.measure");
660            else if (Configuration.doAutoCreate())
661              this.measure = new CodeableConcept(); // cc
662          return this.measure;
663        }
664
665        public boolean hasMeasure() { 
666          return this.measure != null && !this.measure.isEmpty();
667        }
668
669        /**
670         * @param value {@link #measure} (The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level.)
671         */
672        public PlanDefinitionGoalTargetComponent setMeasure(CodeableConcept value) { 
673          this.measure = value;
674          return this;
675        }
676
677        /**
678         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
679         */
680        public DataType getDetail() { 
681          return this.detail;
682        }
683
684        /**
685         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
686         */
687        public Quantity getDetailQuantity() throws FHIRException { 
688          if (this.detail == null)
689            this.detail = new Quantity();
690          if (!(this.detail instanceof Quantity))
691            throw new FHIRException("Type mismatch: the type Quantity was expected, but "+this.detail.getClass().getName()+" was encountered");
692          return (Quantity) this.detail;
693        }
694
695        public boolean hasDetailQuantity() { 
696          return this != null && this.detail instanceof Quantity;
697        }
698
699        /**
700         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
701         */
702        public Range getDetailRange() throws FHIRException { 
703          if (this.detail == null)
704            this.detail = new Range();
705          if (!(this.detail instanceof Range))
706            throw new FHIRException("Type mismatch: the type Range was expected, but "+this.detail.getClass().getName()+" was encountered");
707          return (Range) this.detail;
708        }
709
710        public boolean hasDetailRange() { 
711          return this != null && this.detail instanceof Range;
712        }
713
714        /**
715         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
716         */
717        public CodeableConcept getDetailCodeableConcept() throws FHIRException { 
718          if (this.detail == null)
719            this.detail = new CodeableConcept();
720          if (!(this.detail instanceof CodeableConcept))
721            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.detail.getClass().getName()+" was encountered");
722          return (CodeableConcept) this.detail;
723        }
724
725        public boolean hasDetailCodeableConcept() { 
726          return this != null && this.detail instanceof CodeableConcept;
727        }
728
729        /**
730         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
731         */
732        public StringType getDetailStringType() throws FHIRException { 
733          if (this.detail == null)
734            this.detail = new StringType();
735          if (!(this.detail instanceof StringType))
736            throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.detail.getClass().getName()+" was encountered");
737          return (StringType) this.detail;
738        }
739
740        public boolean hasDetailStringType() { 
741          return this != null && this.detail instanceof StringType;
742        }
743
744        /**
745         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
746         */
747        public BooleanType getDetailBooleanType() throws FHIRException { 
748          if (this.detail == null)
749            this.detail = new BooleanType();
750          if (!(this.detail instanceof BooleanType))
751            throw new FHIRException("Type mismatch: the type BooleanType was expected, but "+this.detail.getClass().getName()+" was encountered");
752          return (BooleanType) this.detail;
753        }
754
755        public boolean hasDetailBooleanType() { 
756          return this != null && this.detail instanceof BooleanType;
757        }
758
759        /**
760         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
761         */
762        public IntegerType getDetailIntegerType() throws FHIRException { 
763          if (this.detail == null)
764            this.detail = new IntegerType();
765          if (!(this.detail instanceof IntegerType))
766            throw new FHIRException("Type mismatch: the type IntegerType was expected, but "+this.detail.getClass().getName()+" was encountered");
767          return (IntegerType) this.detail;
768        }
769
770        public boolean hasDetailIntegerType() { 
771          return this != null && this.detail instanceof IntegerType;
772        }
773
774        /**
775         * @return {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
776         */
777        public Ratio getDetailRatio() throws FHIRException { 
778          if (this.detail == null)
779            this.detail = new Ratio();
780          if (!(this.detail instanceof Ratio))
781            throw new FHIRException("Type mismatch: the type Ratio was expected, but "+this.detail.getClass().getName()+" was encountered");
782          return (Ratio) this.detail;
783        }
784
785        public boolean hasDetailRatio() { 
786          return this != null && this.detail instanceof Ratio;
787        }
788
789        public boolean hasDetail() { 
790          return this.detail != null && !this.detail.isEmpty();
791        }
792
793        /**
794         * @param value {@link #detail} (The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.)
795         */
796        public PlanDefinitionGoalTargetComponent setDetail(DataType value) { 
797          if (value != null && !(value instanceof Quantity || value instanceof Range || value instanceof CodeableConcept || value instanceof StringType || value instanceof BooleanType || value instanceof IntegerType || value instanceof Ratio))
798            throw new FHIRException("Not the right type for PlanDefinition.goal.target.detail[x]: "+value.fhirType());
799          this.detail = value;
800          return this;
801        }
802
803        /**
804         * @return {@link #due} (Indicates the timeframe after the start of the goal in which the goal should be met.)
805         */
806        public Duration getDue() { 
807          if (this.due == null)
808            if (Configuration.errorOnAutoCreate())
809              throw new Error("Attempt to auto-create PlanDefinitionGoalTargetComponent.due");
810            else if (Configuration.doAutoCreate())
811              this.due = new Duration(); // cc
812          return this.due;
813        }
814
815        public boolean hasDue() { 
816          return this.due != null && !this.due.isEmpty();
817        }
818
819        /**
820         * @param value {@link #due} (Indicates the timeframe after the start of the goal in which the goal should be met.)
821         */
822        public PlanDefinitionGoalTargetComponent setDue(Duration value) { 
823          this.due = value;
824          return this;
825        }
826
827        protected void listChildren(List<Property> children) {
828          super.listChildren(children);
829          children.add(new Property("measure", "CodeableConcept", "The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level.", 0, 1, measure));
830          children.add(new Property("detail[x]", "Quantity|Range|CodeableConcept|string|boolean|integer|Ratio", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail));
831          children.add(new Property("due", "Duration", "Indicates the timeframe after the start of the goal in which the goal should be met.", 0, 1, due));
832        }
833
834        @Override
835        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
836          switch (_hash) {
837          case 938321246: /*measure*/  return new Property("measure", "CodeableConcept", "The parameter whose value is to be tracked, e.g. body weight, blood pressure, or hemoglobin A1c level.", 0, 1, measure);
838          case -1973084529: /*detail[x]*/  return new Property("detail[x]", "Quantity|Range|CodeableConcept|string|boolean|integer|Ratio", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
839          case -1335224239: /*detail*/  return new Property("detail[x]", "Quantity|Range|CodeableConcept|string|boolean|integer|Ratio", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
840          case -1313079300: /*detailQuantity*/  return new Property("detail[x]", "Quantity", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
841          case -2062632084: /*detailRange*/  return new Property("detail[x]", "Range", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
842          case -175586544: /*detailCodeableConcept*/  return new Property("detail[x]", "CodeableConcept", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
843          case 529212354: /*detailString*/  return new Property("detail[x]", "string", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
844          case 1172184727: /*detailBoolean*/  return new Property("detail[x]", "boolean", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
845          case -1229442131: /*detailInteger*/  return new Property("detail[x]", "integer", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
846          case -2062626246: /*detailRatio*/  return new Property("detail[x]", "Ratio", "The target value of the measure to be achieved to signify fulfillment of the goal, e.g. 150 pounds or 7.0%, or in the case of pharmaceutical quality - NMT 0.6%, Clear solution, etc. Either the high or low or both values of the range can be specified. When a low value is missing, it indicates that the goal is achieved at any value at or below the high value. Similarly, if the high value is missing, it indicates that the goal is achieved at any value at or above the low value.", 0, 1, detail);
847          case 99828: /*due*/  return new Property("due", "Duration", "Indicates the timeframe after the start of the goal in which the goal should be met.", 0, 1, due);
848          default: return super.getNamedProperty(_hash, _name, _checkValid);
849          }
850
851        }
852
853      @Override
854      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
855        switch (hash) {
856        case 938321246: /*measure*/ return this.measure == null ? new Base[0] : new Base[] {this.measure}; // CodeableConcept
857        case -1335224239: /*detail*/ return this.detail == null ? new Base[0] : new Base[] {this.detail}; // DataType
858        case 99828: /*due*/ return this.due == null ? new Base[0] : new Base[] {this.due}; // Duration
859        default: return super.getProperty(hash, name, checkValid);
860        }
861
862      }
863
864      @Override
865      public Base setProperty(int hash, String name, Base value) throws FHIRException {
866        switch (hash) {
867        case 938321246: // measure
868          this.measure = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
869          return value;
870        case -1335224239: // detail
871          this.detail = TypeConvertor.castToType(value); // DataType
872          return value;
873        case 99828: // due
874          this.due = TypeConvertor.castToDuration(value); // Duration
875          return value;
876        default: return super.setProperty(hash, name, value);
877        }
878
879      }
880
881      @Override
882      public Base setProperty(String name, Base value) throws FHIRException {
883        if (name.equals("measure")) {
884          this.measure = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
885        } else if (name.equals("detail[x]")) {
886          this.detail = TypeConvertor.castToType(value); // DataType
887        } else if (name.equals("due")) {
888          this.due = TypeConvertor.castToDuration(value); // Duration
889        } else
890          return super.setProperty(name, value);
891        return value;
892      }
893
894  @Override
895  public void removeChild(String name, Base value) throws FHIRException {
896        if (name.equals("measure")) {
897          this.measure = null;
898        } else if (name.equals("detail[x]")) {
899          this.detail = null;
900        } else if (name.equals("due")) {
901          this.due = null;
902        } else
903          super.removeChild(name, value);
904        
905      }
906
907      @Override
908      public Base makeProperty(int hash, String name) throws FHIRException {
909        switch (hash) {
910        case 938321246:  return getMeasure();
911        case -1973084529:  return getDetail();
912        case -1335224239:  return getDetail();
913        case 99828:  return getDue();
914        default: return super.makeProperty(hash, name);
915        }
916
917      }
918
919      @Override
920      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
921        switch (hash) {
922        case 938321246: /*measure*/ return new String[] {"CodeableConcept"};
923        case -1335224239: /*detail*/ return new String[] {"Quantity", "Range", "CodeableConcept", "string", "boolean", "integer", "Ratio"};
924        case 99828: /*due*/ return new String[] {"Duration"};
925        default: return super.getTypesForProperty(hash, name);
926        }
927
928      }
929
930      @Override
931      public Base addChild(String name) throws FHIRException {
932        if (name.equals("measure")) {
933          this.measure = new CodeableConcept();
934          return this.measure;
935        }
936        else if (name.equals("detailQuantity")) {
937          this.detail = new Quantity();
938          return this.detail;
939        }
940        else if (name.equals("detailRange")) {
941          this.detail = new Range();
942          return this.detail;
943        }
944        else if (name.equals("detailCodeableConcept")) {
945          this.detail = new CodeableConcept();
946          return this.detail;
947        }
948        else if (name.equals("detailString")) {
949          this.detail = new StringType();
950          return this.detail;
951        }
952        else if (name.equals("detailBoolean")) {
953          this.detail = new BooleanType();
954          return this.detail;
955        }
956        else if (name.equals("detailInteger")) {
957          this.detail = new IntegerType();
958          return this.detail;
959        }
960        else if (name.equals("detailRatio")) {
961          this.detail = new Ratio();
962          return this.detail;
963        }
964        else if (name.equals("due")) {
965          this.due = new Duration();
966          return this.due;
967        }
968        else
969          return super.addChild(name);
970      }
971
972      public PlanDefinitionGoalTargetComponent copy() {
973        PlanDefinitionGoalTargetComponent dst = new PlanDefinitionGoalTargetComponent();
974        copyValues(dst);
975        return dst;
976      }
977
978      public void copyValues(PlanDefinitionGoalTargetComponent dst) {
979        super.copyValues(dst);
980        dst.measure = measure == null ? null : measure.copy();
981        dst.detail = detail == null ? null : detail.copy();
982        dst.due = due == null ? null : due.copy();
983      }
984
985      @Override
986      public boolean equalsDeep(Base other_) {
987        if (!super.equalsDeep(other_))
988          return false;
989        if (!(other_ instanceof PlanDefinitionGoalTargetComponent))
990          return false;
991        PlanDefinitionGoalTargetComponent o = (PlanDefinitionGoalTargetComponent) other_;
992        return compareDeep(measure, o.measure, true) && compareDeep(detail, o.detail, true) && compareDeep(due, o.due, true)
993          ;
994      }
995
996      @Override
997      public boolean equalsShallow(Base other_) {
998        if (!super.equalsShallow(other_))
999          return false;
1000        if (!(other_ instanceof PlanDefinitionGoalTargetComponent))
1001          return false;
1002        PlanDefinitionGoalTargetComponent o = (PlanDefinitionGoalTargetComponent) other_;
1003        return true;
1004      }
1005
1006      public boolean isEmpty() {
1007        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(measure, detail, due);
1008      }
1009
1010  public String fhirType() {
1011    return "PlanDefinition.goal.target";
1012
1013  }
1014
1015  }
1016
1017    @Block()
1018    public static class PlanDefinitionActorComponent extends BackboneElement implements IBaseBackboneElement {
1019        /**
1020         * A descriptive label for the actor.
1021         */
1022        @Child(name = "title", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
1023        @Description(shortDefinition="User-visible title", formalDefinition="A descriptive label for the actor." )
1024        protected StringType title;
1025
1026        /**
1027         * A description of how the actor fits into the overall actions of the plan definition.
1028         */
1029        @Child(name = "description", type = {MarkdownType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1030        @Description(shortDefinition="Describes the actor", formalDefinition="A description of how the actor fits into the overall actions of the plan definition." )
1031        protected MarkdownType description;
1032
1033        /**
1034         * The characteristics of the candidates that could serve as the actor.
1035         */
1036        @Child(name = "option", type = {}, order=3, min=1, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1037        @Description(shortDefinition="Who or what can be this actor", formalDefinition="The characteristics of the candidates that could serve as the actor." )
1038        protected List<PlanDefinitionActorOptionComponent> option;
1039
1040        private static final long serialVersionUID = -571302300L;
1041
1042    /**
1043     * Constructor
1044     */
1045      public PlanDefinitionActorComponent() {
1046        super();
1047      }
1048
1049    /**
1050     * Constructor
1051     */
1052      public PlanDefinitionActorComponent(PlanDefinitionActorOptionComponent option) {
1053        super();
1054        this.addOption(option);
1055      }
1056
1057        /**
1058         * @return {@link #title} (A descriptive label for the actor.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
1059         */
1060        public StringType getTitleElement() { 
1061          if (this.title == null)
1062            if (Configuration.errorOnAutoCreate())
1063              throw new Error("Attempt to auto-create PlanDefinitionActorComponent.title");
1064            else if (Configuration.doAutoCreate())
1065              this.title = new StringType(); // bb
1066          return this.title;
1067        }
1068
1069        public boolean hasTitleElement() { 
1070          return this.title != null && !this.title.isEmpty();
1071        }
1072
1073        public boolean hasTitle() { 
1074          return this.title != null && !this.title.isEmpty();
1075        }
1076
1077        /**
1078         * @param value {@link #title} (A descriptive label for the actor.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
1079         */
1080        public PlanDefinitionActorComponent setTitleElement(StringType value) { 
1081          this.title = value;
1082          return this;
1083        }
1084
1085        /**
1086         * @return A descriptive label for the actor.
1087         */
1088        public String getTitle() { 
1089          return this.title == null ? null : this.title.getValue();
1090        }
1091
1092        /**
1093         * @param value A descriptive label for the actor.
1094         */
1095        public PlanDefinitionActorComponent setTitle(String value) { 
1096          if (Utilities.noString(value))
1097            this.title = null;
1098          else {
1099            if (this.title == null)
1100              this.title = new StringType();
1101            this.title.setValue(value);
1102          }
1103          return this;
1104        }
1105
1106        /**
1107         * @return {@link #description} (A description of how the actor fits into the overall actions of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
1108         */
1109        public MarkdownType getDescriptionElement() { 
1110          if (this.description == null)
1111            if (Configuration.errorOnAutoCreate())
1112              throw new Error("Attempt to auto-create PlanDefinitionActorComponent.description");
1113            else if (Configuration.doAutoCreate())
1114              this.description = new MarkdownType(); // bb
1115          return this.description;
1116        }
1117
1118        public boolean hasDescriptionElement() { 
1119          return this.description != null && !this.description.isEmpty();
1120        }
1121
1122        public boolean hasDescription() { 
1123          return this.description != null && !this.description.isEmpty();
1124        }
1125
1126        /**
1127         * @param value {@link #description} (A description of how the actor fits into the overall actions of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
1128         */
1129        public PlanDefinitionActorComponent setDescriptionElement(MarkdownType value) { 
1130          this.description = value;
1131          return this;
1132        }
1133
1134        /**
1135         * @return A description of how the actor fits into the overall actions of the plan definition.
1136         */
1137        public String getDescription() { 
1138          return this.description == null ? null : this.description.getValue();
1139        }
1140
1141        /**
1142         * @param value A description of how the actor fits into the overall actions of the plan definition.
1143         */
1144        public PlanDefinitionActorComponent setDescription(String value) { 
1145          if (Utilities.noString(value))
1146            this.description = null;
1147          else {
1148            if (this.description == null)
1149              this.description = new MarkdownType();
1150            this.description.setValue(value);
1151          }
1152          return this;
1153        }
1154
1155        /**
1156         * @return {@link #option} (The characteristics of the candidates that could serve as the actor.)
1157         */
1158        public List<PlanDefinitionActorOptionComponent> getOption() { 
1159          if (this.option == null)
1160            this.option = new ArrayList<PlanDefinitionActorOptionComponent>();
1161          return this.option;
1162        }
1163
1164        /**
1165         * @return Returns a reference to <code>this</code> for easy method chaining
1166         */
1167        public PlanDefinitionActorComponent setOption(List<PlanDefinitionActorOptionComponent> theOption) { 
1168          this.option = theOption;
1169          return this;
1170        }
1171
1172        public boolean hasOption() { 
1173          if (this.option == null)
1174            return false;
1175          for (PlanDefinitionActorOptionComponent item : this.option)
1176            if (!item.isEmpty())
1177              return true;
1178          return false;
1179        }
1180
1181        public PlanDefinitionActorOptionComponent addOption() { //3
1182          PlanDefinitionActorOptionComponent t = new PlanDefinitionActorOptionComponent();
1183          if (this.option == null)
1184            this.option = new ArrayList<PlanDefinitionActorOptionComponent>();
1185          this.option.add(t);
1186          return t;
1187        }
1188
1189        public PlanDefinitionActorComponent addOption(PlanDefinitionActorOptionComponent t) { //3
1190          if (t == null)
1191            return this;
1192          if (this.option == null)
1193            this.option = new ArrayList<PlanDefinitionActorOptionComponent>();
1194          this.option.add(t);
1195          return this;
1196        }
1197
1198        /**
1199         * @return The first repetition of repeating field {@link #option}, creating it if it does not already exist {3}
1200         */
1201        public PlanDefinitionActorOptionComponent getOptionFirstRep() { 
1202          if (getOption().isEmpty()) {
1203            addOption();
1204          }
1205          return getOption().get(0);
1206        }
1207
1208        protected void listChildren(List<Property> children) {
1209          super.listChildren(children);
1210          children.add(new Property("title", "string", "A descriptive label for the actor.", 0, 1, title));
1211          children.add(new Property("description", "markdown", "A description of how the actor fits into the overall actions of the plan definition.", 0, 1, description));
1212          children.add(new Property("option", "", "The characteristics of the candidates that could serve as the actor.", 0, java.lang.Integer.MAX_VALUE, option));
1213        }
1214
1215        @Override
1216        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1217          switch (_hash) {
1218          case 110371416: /*title*/  return new Property("title", "string", "A descriptive label for the actor.", 0, 1, title);
1219          case -1724546052: /*description*/  return new Property("description", "markdown", "A description of how the actor fits into the overall actions of the plan definition.", 0, 1, description);
1220          case -1010136971: /*option*/  return new Property("option", "", "The characteristics of the candidates that could serve as the actor.", 0, java.lang.Integer.MAX_VALUE, option);
1221          default: return super.getNamedProperty(_hash, _name, _checkValid);
1222          }
1223
1224        }
1225
1226      @Override
1227      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1228        switch (hash) {
1229        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
1230        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
1231        case -1010136971: /*option*/ return this.option == null ? new Base[0] : this.option.toArray(new Base[this.option.size()]); // PlanDefinitionActorOptionComponent
1232        default: return super.getProperty(hash, name, checkValid);
1233        }
1234
1235      }
1236
1237      @Override
1238      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1239        switch (hash) {
1240        case 110371416: // title
1241          this.title = TypeConvertor.castToString(value); // StringType
1242          return value;
1243        case -1724546052: // description
1244          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
1245          return value;
1246        case -1010136971: // option
1247          this.getOption().add((PlanDefinitionActorOptionComponent) value); // PlanDefinitionActorOptionComponent
1248          return value;
1249        default: return super.setProperty(hash, name, value);
1250        }
1251
1252      }
1253
1254      @Override
1255      public Base setProperty(String name, Base value) throws FHIRException {
1256        if (name.equals("title")) {
1257          this.title = TypeConvertor.castToString(value); // StringType
1258        } else if (name.equals("description")) {
1259          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
1260        } else if (name.equals("option")) {
1261          this.getOption().add((PlanDefinitionActorOptionComponent) value);
1262        } else
1263          return super.setProperty(name, value);
1264        return value;
1265      }
1266
1267  @Override
1268  public void removeChild(String name, Base value) throws FHIRException {
1269        if (name.equals("title")) {
1270          this.title = null;
1271        } else if (name.equals("description")) {
1272          this.description = null;
1273        } else if (name.equals("option")) {
1274          this.getOption().remove((PlanDefinitionActorOptionComponent) value);
1275        } else
1276          super.removeChild(name, value);
1277        
1278      }
1279
1280      @Override
1281      public Base makeProperty(int hash, String name) throws FHIRException {
1282        switch (hash) {
1283        case 110371416:  return getTitleElement();
1284        case -1724546052:  return getDescriptionElement();
1285        case -1010136971:  return addOption(); 
1286        default: return super.makeProperty(hash, name);
1287        }
1288
1289      }
1290
1291      @Override
1292      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1293        switch (hash) {
1294        case 110371416: /*title*/ return new String[] {"string"};
1295        case -1724546052: /*description*/ return new String[] {"markdown"};
1296        case -1010136971: /*option*/ return new String[] {};
1297        default: return super.getTypesForProperty(hash, name);
1298        }
1299
1300      }
1301
1302      @Override
1303      public Base addChild(String name) throws FHIRException {
1304        if (name.equals("title")) {
1305          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.actor.title");
1306        }
1307        else if (name.equals("description")) {
1308          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.actor.description");
1309        }
1310        else if (name.equals("option")) {
1311          return addOption();
1312        }
1313        else
1314          return super.addChild(name);
1315      }
1316
1317      public PlanDefinitionActorComponent copy() {
1318        PlanDefinitionActorComponent dst = new PlanDefinitionActorComponent();
1319        copyValues(dst);
1320        return dst;
1321      }
1322
1323      public void copyValues(PlanDefinitionActorComponent dst) {
1324        super.copyValues(dst);
1325        dst.title = title == null ? null : title.copy();
1326        dst.description = description == null ? null : description.copy();
1327        if (option != null) {
1328          dst.option = new ArrayList<PlanDefinitionActorOptionComponent>();
1329          for (PlanDefinitionActorOptionComponent i : option)
1330            dst.option.add(i.copy());
1331        };
1332      }
1333
1334      @Override
1335      public boolean equalsDeep(Base other_) {
1336        if (!super.equalsDeep(other_))
1337          return false;
1338        if (!(other_ instanceof PlanDefinitionActorComponent))
1339          return false;
1340        PlanDefinitionActorComponent o = (PlanDefinitionActorComponent) other_;
1341        return compareDeep(title, o.title, true) && compareDeep(description, o.description, true) && compareDeep(option, o.option, true)
1342          ;
1343      }
1344
1345      @Override
1346      public boolean equalsShallow(Base other_) {
1347        if (!super.equalsShallow(other_))
1348          return false;
1349        if (!(other_ instanceof PlanDefinitionActorComponent))
1350          return false;
1351        PlanDefinitionActorComponent o = (PlanDefinitionActorComponent) other_;
1352        return compareValues(title, o.title, true) && compareValues(description, o.description, true);
1353      }
1354
1355      public boolean isEmpty() {
1356        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(title, description, option
1357          );
1358      }
1359
1360  public String fhirType() {
1361    return "PlanDefinition.actor";
1362
1363  }
1364
1365  }
1366
1367    @Block()
1368    public static class PlanDefinitionActorOptionComponent extends BackboneElement implements IBaseBackboneElement {
1369        /**
1370         * The type of participant in the action.
1371         */
1372        @Child(name = "type", type = {CodeType.class}, order=1, min=0, max=1, modifier=false, summary=false)
1373        @Description(shortDefinition="careteam | device | group | healthcareservice | location | organization | patient | practitioner | practitionerrole | relatedperson", formalDefinition="The type of participant in the action." )
1374        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-participant-type")
1375        protected Enumeration<ActionParticipantType> type;
1376
1377        /**
1378         * The type of participant in the action.
1379         */
1380        @Child(name = "typeCanonical", type = {CanonicalType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1381        @Description(shortDefinition="Who or what can participate", formalDefinition="The type of participant in the action." )
1382        protected CanonicalType typeCanonical;
1383
1384        /**
1385         * The type of participant in the action.
1386         */
1387        @Child(name = "typeReference", type = {CareTeam.class, Device.class, DeviceDefinition.class, Endpoint.class, Group.class, HealthcareService.class, Location.class, Organization.class, Patient.class, Practitioner.class, PractitionerRole.class, RelatedPerson.class}, order=3, min=0, max=1, modifier=false, summary=false)
1388        @Description(shortDefinition="Who or what can participate", formalDefinition="The type of participant in the action." )
1389        protected Reference typeReference;
1390
1391        /**
1392         * The role the participant should play in performing the described action.
1393         */
1394        @Child(name = "role", type = {CodeableConcept.class}, order=4, min=0, max=1, modifier=false, summary=false)
1395        @Description(shortDefinition="E.g. Nurse, Surgeon, Parent", formalDefinition="The role the participant should play in performing the described action." )
1396        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/action-participant-role")
1397        protected CodeableConcept role;
1398
1399        private static final long serialVersionUID = 1881639157L;
1400
1401    /**
1402     * Constructor
1403     */
1404      public PlanDefinitionActorOptionComponent() {
1405        super();
1406      }
1407
1408        /**
1409         * @return {@link #type} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
1410         */
1411        public Enumeration<ActionParticipantType> getTypeElement() { 
1412          if (this.type == null)
1413            if (Configuration.errorOnAutoCreate())
1414              throw new Error("Attempt to auto-create PlanDefinitionActorOptionComponent.type");
1415            else if (Configuration.doAutoCreate())
1416              this.type = new Enumeration<ActionParticipantType>(new ActionParticipantTypeEnumFactory()); // bb
1417          return this.type;
1418        }
1419
1420        public boolean hasTypeElement() { 
1421          return this.type != null && !this.type.isEmpty();
1422        }
1423
1424        public boolean hasType() { 
1425          return this.type != null && !this.type.isEmpty();
1426        }
1427
1428        /**
1429         * @param value {@link #type} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
1430         */
1431        public PlanDefinitionActorOptionComponent setTypeElement(Enumeration<ActionParticipantType> value) { 
1432          this.type = value;
1433          return this;
1434        }
1435
1436        /**
1437         * @return The type of participant in the action.
1438         */
1439        public ActionParticipantType getType() { 
1440          return this.type == null ? null : this.type.getValue();
1441        }
1442
1443        /**
1444         * @param value The type of participant in the action.
1445         */
1446        public PlanDefinitionActorOptionComponent setType(ActionParticipantType value) { 
1447          if (value == null)
1448            this.type = null;
1449          else {
1450            if (this.type == null)
1451              this.type = new Enumeration<ActionParticipantType>(new ActionParticipantTypeEnumFactory());
1452            this.type.setValue(value);
1453          }
1454          return this;
1455        }
1456
1457        /**
1458         * @return {@link #typeCanonical} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getTypeCanonical" gives direct access to the value
1459         */
1460        public CanonicalType getTypeCanonicalElement() { 
1461          if (this.typeCanonical == null)
1462            if (Configuration.errorOnAutoCreate())
1463              throw new Error("Attempt to auto-create PlanDefinitionActorOptionComponent.typeCanonical");
1464            else if (Configuration.doAutoCreate())
1465              this.typeCanonical = new CanonicalType(); // bb
1466          return this.typeCanonical;
1467        }
1468
1469        public boolean hasTypeCanonicalElement() { 
1470          return this.typeCanonical != null && !this.typeCanonical.isEmpty();
1471        }
1472
1473        public boolean hasTypeCanonical() { 
1474          return this.typeCanonical != null && !this.typeCanonical.isEmpty();
1475        }
1476
1477        /**
1478         * @param value {@link #typeCanonical} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getTypeCanonical" gives direct access to the value
1479         */
1480        public PlanDefinitionActorOptionComponent setTypeCanonicalElement(CanonicalType value) { 
1481          this.typeCanonical = value;
1482          return this;
1483        }
1484
1485        /**
1486         * @return The type of participant in the action.
1487         */
1488        public String getTypeCanonical() { 
1489          return this.typeCanonical == null ? null : this.typeCanonical.getValue();
1490        }
1491
1492        /**
1493         * @param value The type of participant in the action.
1494         */
1495        public PlanDefinitionActorOptionComponent setTypeCanonical(String value) { 
1496          if (Utilities.noString(value))
1497            this.typeCanonical = null;
1498          else {
1499            if (this.typeCanonical == null)
1500              this.typeCanonical = new CanonicalType();
1501            this.typeCanonical.setValue(value);
1502          }
1503          return this;
1504        }
1505
1506        /**
1507         * @return {@link #typeReference} (The type of participant in the action.)
1508         */
1509        public Reference getTypeReference() { 
1510          if (this.typeReference == null)
1511            if (Configuration.errorOnAutoCreate())
1512              throw new Error("Attempt to auto-create PlanDefinitionActorOptionComponent.typeReference");
1513            else if (Configuration.doAutoCreate())
1514              this.typeReference = new Reference(); // cc
1515          return this.typeReference;
1516        }
1517
1518        public boolean hasTypeReference() { 
1519          return this.typeReference != null && !this.typeReference.isEmpty();
1520        }
1521
1522        /**
1523         * @param value {@link #typeReference} (The type of participant in the action.)
1524         */
1525        public PlanDefinitionActorOptionComponent setTypeReference(Reference value) { 
1526          this.typeReference = value;
1527          return this;
1528        }
1529
1530        /**
1531         * @return {@link #role} (The role the participant should play in performing the described action.)
1532         */
1533        public CodeableConcept getRole() { 
1534          if (this.role == null)
1535            if (Configuration.errorOnAutoCreate())
1536              throw new Error("Attempt to auto-create PlanDefinitionActorOptionComponent.role");
1537            else if (Configuration.doAutoCreate())
1538              this.role = new CodeableConcept(); // cc
1539          return this.role;
1540        }
1541
1542        public boolean hasRole() { 
1543          return this.role != null && !this.role.isEmpty();
1544        }
1545
1546        /**
1547         * @param value {@link #role} (The role the participant should play in performing the described action.)
1548         */
1549        public PlanDefinitionActorOptionComponent setRole(CodeableConcept value) { 
1550          this.role = value;
1551          return this;
1552        }
1553
1554        protected void listChildren(List<Property> children) {
1555          super.listChildren(children);
1556          children.add(new Property("type", "code", "The type of participant in the action.", 0, 1, type));
1557          children.add(new Property("typeCanonical", "canonical(CapabilityStatement)", "The type of participant in the action.", 0, 1, typeCanonical));
1558          children.add(new Property("typeReference", "Reference(CareTeam|Device|DeviceDefinition|Endpoint|Group|HealthcareService|Location|Organization|Patient|Practitioner|PractitionerRole|RelatedPerson)", "The type of participant in the action.", 0, 1, typeReference));
1559          children.add(new Property("role", "CodeableConcept", "The role the participant should play in performing the described action.", 0, 1, role));
1560        }
1561
1562        @Override
1563        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
1564          switch (_hash) {
1565          case 3575610: /*type*/  return new Property("type", "code", "The type of participant in the action.", 0, 1, type);
1566          case -466635046: /*typeCanonical*/  return new Property("typeCanonical", "canonical(CapabilityStatement)", "The type of participant in the action.", 0, 1, typeCanonical);
1567          case 2074825009: /*typeReference*/  return new Property("typeReference", "Reference(CareTeam|Device|DeviceDefinition|Endpoint|Group|HealthcareService|Location|Organization|Patient|Practitioner|PractitionerRole|RelatedPerson)", "The type of participant in the action.", 0, 1, typeReference);
1568          case 3506294: /*role*/  return new Property("role", "CodeableConcept", "The role the participant should play in performing the described action.", 0, 1, role);
1569          default: return super.getNamedProperty(_hash, _name, _checkValid);
1570          }
1571
1572        }
1573
1574      @Override
1575      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
1576        switch (hash) {
1577        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // Enumeration<ActionParticipantType>
1578        case -466635046: /*typeCanonical*/ return this.typeCanonical == null ? new Base[0] : new Base[] {this.typeCanonical}; // CanonicalType
1579        case 2074825009: /*typeReference*/ return this.typeReference == null ? new Base[0] : new Base[] {this.typeReference}; // Reference
1580        case 3506294: /*role*/ return this.role == null ? new Base[0] : new Base[] {this.role}; // CodeableConcept
1581        default: return super.getProperty(hash, name, checkValid);
1582        }
1583
1584      }
1585
1586      @Override
1587      public Base setProperty(int hash, String name, Base value) throws FHIRException {
1588        switch (hash) {
1589        case 3575610: // type
1590          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
1591          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
1592          return value;
1593        case -466635046: // typeCanonical
1594          this.typeCanonical = TypeConvertor.castToCanonical(value); // CanonicalType
1595          return value;
1596        case 2074825009: // typeReference
1597          this.typeReference = TypeConvertor.castToReference(value); // Reference
1598          return value;
1599        case 3506294: // role
1600          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1601          return value;
1602        default: return super.setProperty(hash, name, value);
1603        }
1604
1605      }
1606
1607      @Override
1608      public Base setProperty(String name, Base value) throws FHIRException {
1609        if (name.equals("type")) {
1610          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
1611          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
1612        } else if (name.equals("typeCanonical")) {
1613          this.typeCanonical = TypeConvertor.castToCanonical(value); // CanonicalType
1614        } else if (name.equals("typeReference")) {
1615          this.typeReference = TypeConvertor.castToReference(value); // Reference
1616        } else if (name.equals("role")) {
1617          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
1618        } else
1619          return super.setProperty(name, value);
1620        return value;
1621      }
1622
1623  @Override
1624  public void removeChild(String name, Base value) throws FHIRException {
1625        if (name.equals("type")) {
1626          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
1627          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
1628        } else if (name.equals("typeCanonical")) {
1629          this.typeCanonical = null;
1630        } else if (name.equals("typeReference")) {
1631          this.typeReference = null;
1632        } else if (name.equals("role")) {
1633          this.role = null;
1634        } else
1635          super.removeChild(name, value);
1636        
1637      }
1638
1639      @Override
1640      public Base makeProperty(int hash, String name) throws FHIRException {
1641        switch (hash) {
1642        case 3575610:  return getTypeElement();
1643        case -466635046:  return getTypeCanonicalElement();
1644        case 2074825009:  return getTypeReference();
1645        case 3506294:  return getRole();
1646        default: return super.makeProperty(hash, name);
1647        }
1648
1649      }
1650
1651      @Override
1652      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
1653        switch (hash) {
1654        case 3575610: /*type*/ return new String[] {"code"};
1655        case -466635046: /*typeCanonical*/ return new String[] {"canonical"};
1656        case 2074825009: /*typeReference*/ return new String[] {"Reference"};
1657        case 3506294: /*role*/ return new String[] {"CodeableConcept"};
1658        default: return super.getTypesForProperty(hash, name);
1659        }
1660
1661      }
1662
1663      @Override
1664      public Base addChild(String name) throws FHIRException {
1665        if (name.equals("type")) {
1666          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.actor.option.type");
1667        }
1668        else if (name.equals("typeCanonical")) {
1669          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.actor.option.typeCanonical");
1670        }
1671        else if (name.equals("typeReference")) {
1672          this.typeReference = new Reference();
1673          return this.typeReference;
1674        }
1675        else if (name.equals("role")) {
1676          this.role = new CodeableConcept();
1677          return this.role;
1678        }
1679        else
1680          return super.addChild(name);
1681      }
1682
1683      public PlanDefinitionActorOptionComponent copy() {
1684        PlanDefinitionActorOptionComponent dst = new PlanDefinitionActorOptionComponent();
1685        copyValues(dst);
1686        return dst;
1687      }
1688
1689      public void copyValues(PlanDefinitionActorOptionComponent dst) {
1690        super.copyValues(dst);
1691        dst.type = type == null ? null : type.copy();
1692        dst.typeCanonical = typeCanonical == null ? null : typeCanonical.copy();
1693        dst.typeReference = typeReference == null ? null : typeReference.copy();
1694        dst.role = role == null ? null : role.copy();
1695      }
1696
1697      @Override
1698      public boolean equalsDeep(Base other_) {
1699        if (!super.equalsDeep(other_))
1700          return false;
1701        if (!(other_ instanceof PlanDefinitionActorOptionComponent))
1702          return false;
1703        PlanDefinitionActorOptionComponent o = (PlanDefinitionActorOptionComponent) other_;
1704        return compareDeep(type, o.type, true) && compareDeep(typeCanonical, o.typeCanonical, true) && compareDeep(typeReference, o.typeReference, true)
1705           && compareDeep(role, o.role, true);
1706      }
1707
1708      @Override
1709      public boolean equalsShallow(Base other_) {
1710        if (!super.equalsShallow(other_))
1711          return false;
1712        if (!(other_ instanceof PlanDefinitionActorOptionComponent))
1713          return false;
1714        PlanDefinitionActorOptionComponent o = (PlanDefinitionActorOptionComponent) other_;
1715        return compareValues(type, o.type, true) && compareValues(typeCanonical, o.typeCanonical, true);
1716      }
1717
1718      public boolean isEmpty() {
1719        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(type, typeCanonical, typeReference
1720          , role);
1721      }
1722
1723  public String fhirType() {
1724    return "PlanDefinition.actor.option";
1725
1726  }
1727
1728  }
1729
1730    @Block()
1731    public static class PlanDefinitionActionComponent extends BackboneElement implements IBaseBackboneElement {
1732        /**
1733         * An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.
1734         */
1735        @Child(name = "linkId", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
1736        @Description(shortDefinition="Unique id for the action in the PlanDefinition", formalDefinition="An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration." )
1737        protected StringType linkId;
1738
1739        /**
1740         * A user-visible prefix for the action. For example a section or item numbering such as 1. or A.
1741         */
1742        @Child(name = "prefix", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=false)
1743        @Description(shortDefinition="User-visible prefix for the action (e.g. 1. or A.)", formalDefinition="A user-visible prefix for the action. For example a section or item numbering such as 1. or A." )
1744        protected StringType prefix;
1745
1746        /**
1747         * The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.
1748         */
1749        @Child(name = "title", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=false)
1750        @Description(shortDefinition="User-visible title", formalDefinition="The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC." )
1751        protected StringType title;
1752
1753        /**
1754         * A brief description of the action used to provide a summary to display to the user.
1755         */
1756        @Child(name = "description", type = {MarkdownType.class}, order=4, min=0, max=1, modifier=false, summary=false)
1757        @Description(shortDefinition="Brief description of the action", formalDefinition="A brief description of the action used to provide a summary to display to the user." )
1758        protected MarkdownType description;
1759
1760        /**
1761         * A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.
1762         */
1763        @Child(name = "textEquivalent", type = {MarkdownType.class}, order=5, min=0, max=1, modifier=false, summary=false)
1764        @Description(shortDefinition="Static text equivalent of the action, used if the dynamic aspects cannot be interpreted by the receiving system", formalDefinition="A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically." )
1765        protected MarkdownType textEquivalent;
1766
1767        /**
1768         * Indicates how quickly the action should be addressed with respect to other actions.
1769         */
1770        @Child(name = "priority", type = {CodeType.class}, order=6, min=0, max=1, modifier=false, summary=false)
1771        @Description(shortDefinition="routine | urgent | asap | stat", formalDefinition="Indicates how quickly the action should be addressed with respect to other actions." )
1772        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/request-priority")
1773        protected Enumeration<RequestPriority> priority;
1774
1775        /**
1776         * A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property.
1777         */
1778        @Child(name = "code", type = {CodeableConcept.class}, order=7, min=0, max=1, modifier=false, summary=false)
1779        @Description(shortDefinition="Code representing the meaning of the action or sub-actions", formalDefinition="A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property." )
1780        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-code")
1781        protected CodeableConcept code;
1782
1783        /**
1784         * A description of why this action is necessary or appropriate.
1785         */
1786        @Child(name = "reason", type = {CodeableConcept.class}, order=8, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1787        @Description(shortDefinition="Why the action should be performed", formalDefinition="A description of why this action is necessary or appropriate." )
1788        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-reason-code")
1789        protected List<CodeableConcept> reason;
1790
1791        /**
1792         * Didactic or other informational resources associated with the action that can be provided to the CDS recipient. Information resources can include inline text commentary and links to web resources.
1793         */
1794        @Child(name = "documentation", type = {RelatedArtifact.class}, order=9, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1795        @Description(shortDefinition="Supporting documentation for the intended performer of the action", formalDefinition="Didactic or other informational resources associated with the action that can be provided to the CDS recipient. Information resources can include inline text commentary and links to web resources." )
1796        protected List<RelatedArtifact> documentation;
1797
1798        /**
1799         * Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.
1800         */
1801        @Child(name = "goalId", type = {IdType.class}, order=10, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1802        @Description(shortDefinition="What goals this action supports", formalDefinition="Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action." )
1803        protected List<IdType> goalId;
1804
1805        /**
1806         * A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.
1807         */
1808        @Child(name = "subject", type = {CodeableConcept.class, Group.class, CanonicalType.class}, order=11, min=0, max=1, modifier=false, summary=false)
1809        @Description(shortDefinition="Type of individual the action is focused on", formalDefinition="A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource." )
1810        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/participant-resource-types")
1811        protected DataType subject;
1812
1813        /**
1814         * A description of when the action should be triggered. When multiple triggers are specified on an action, any triggering event invokes the action.
1815         */
1816        @Child(name = "trigger", type = {TriggerDefinition.class}, order=12, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1817        @Description(shortDefinition="When the action should be triggered", formalDefinition="A description of when the action should be triggered. When multiple triggers are specified on an action, any triggering event invokes the action." )
1818        protected List<TriggerDefinition> trigger;
1819
1820        /**
1821         * An expression that describes applicability criteria or start/stop conditions for the action.
1822         */
1823        @Child(name = "condition", type = {}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1824        @Description(shortDefinition="Whether or not the action is applicable", formalDefinition="An expression that describes applicability criteria or start/stop conditions for the action." )
1825        protected List<PlanDefinitionActionConditionComponent> condition;
1826
1827        /**
1828         * Defines input data requirements for the action.
1829         */
1830        @Child(name = "input", type = {}, order=14, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1831        @Description(shortDefinition="Input data requirements", formalDefinition="Defines input data requirements for the action." )
1832        protected List<PlanDefinitionActionInputComponent> input;
1833
1834        /**
1835         * Defines the outputs of the action, if any.
1836         */
1837        @Child(name = "output", type = {}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1838        @Description(shortDefinition="Output data definition", formalDefinition="Defines the outputs of the action, if any." )
1839        protected List<PlanDefinitionActionOutputComponent> output;
1840
1841        /**
1842         * A relationship to another action such as "before" or "30-60 minutes after start of".
1843         */
1844        @Child(name = "relatedAction", type = {}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1845        @Description(shortDefinition="Relationship to another action", formalDefinition="A relationship to another action such as \"before\" or \"30-60 minutes after start of\"." )
1846        protected List<PlanDefinitionActionRelatedActionComponent> relatedAction;
1847
1848        /**
1849         * An optional value describing when the action should be performed.
1850         */
1851        @Child(name = "timing", type = {Age.class, Duration.class, Range.class, Timing.class}, order=17, min=0, max=1, modifier=false, summary=false)
1852        @Description(shortDefinition="When the action should take place", formalDefinition="An optional value describing when the action should be performed." )
1853        protected DataType timing;
1854
1855        /**
1856         * Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc.
1857         */
1858        @Child(name = "location", type = {CodeableReference.class}, order=18, min=0, max=1, modifier=false, summary=false)
1859        @Description(shortDefinition="Where it should happen", formalDefinition="Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc." )
1860        protected CodeableReference location;
1861
1862        /**
1863         * Indicates who should participate in performing the action described.
1864         */
1865        @Child(name = "participant", type = {}, order=19, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1866        @Description(shortDefinition="Who should participate in the action", formalDefinition="Indicates who should participate in performing the action described." )
1867        protected List<PlanDefinitionActionParticipantComponent> participant;
1868
1869        /**
1870         * The type of action to perform (create, update, remove).
1871         */
1872        @Child(name = "type", type = {CodeableConcept.class}, order=20, min=0, max=1, modifier=false, summary=false)
1873        @Description(shortDefinition="create | update | remove | fire-event", formalDefinition="The type of action to perform (create, update, remove)." )
1874        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-type")
1875        protected CodeableConcept type;
1876
1877        /**
1878         * Defines the grouping behavior for the action and its children.
1879         */
1880        @Child(name = "groupingBehavior", type = {CodeType.class}, order=21, min=0, max=1, modifier=false, summary=false)
1881        @Description(shortDefinition="visual-group | logical-group | sentence-group", formalDefinition="Defines the grouping behavior for the action and its children." )
1882        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-grouping-behavior")
1883        protected Enumeration<ActionGroupingBehavior> groupingBehavior;
1884
1885        /**
1886         * Defines the selection behavior for the action and its children.
1887         */
1888        @Child(name = "selectionBehavior", type = {CodeType.class}, order=22, min=0, max=1, modifier=false, summary=false)
1889        @Description(shortDefinition="any | all | all-or-none | exactly-one | at-most-one | one-or-more", formalDefinition="Defines the selection behavior for the action and its children." )
1890        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-selection-behavior")
1891        protected Enumeration<ActionSelectionBehavior> selectionBehavior;
1892
1893        /**
1894         * Defines the required behavior for the action.
1895         */
1896        @Child(name = "requiredBehavior", type = {CodeType.class}, order=23, min=0, max=1, modifier=false, summary=false)
1897        @Description(shortDefinition="must | could | must-unless-documented", formalDefinition="Defines the required behavior for the action." )
1898        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-required-behavior")
1899        protected Enumeration<ActionRequiredBehavior> requiredBehavior;
1900
1901        /**
1902         * Defines whether the action should usually be preselected.
1903         */
1904        @Child(name = "precheckBehavior", type = {CodeType.class}, order=24, min=0, max=1, modifier=false, summary=false)
1905        @Description(shortDefinition="yes | no", formalDefinition="Defines whether the action should usually be preselected." )
1906        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-precheck-behavior")
1907        protected Enumeration<ActionPrecheckBehavior> precheckBehavior;
1908
1909        /**
1910         * Defines whether the action can be selected multiple times.
1911         */
1912        @Child(name = "cardinalityBehavior", type = {CodeType.class}, order=25, min=0, max=1, modifier=false, summary=false)
1913        @Description(shortDefinition="single | multiple", formalDefinition="Defines whether the action can be selected multiple times." )
1914        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-cardinality-behavior")
1915        protected Enumeration<ActionCardinalityBehavior> cardinalityBehavior;
1916
1917        /**
1918         * A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.
1919         */
1920        @Child(name = "definition", type = {CanonicalType.class, UriType.class}, order=26, min=0, max=1, modifier=false, summary=false)
1921        @Description(shortDefinition="Description of the activity to be performed", formalDefinition="A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured." )
1922        protected DataType definition;
1923
1924        /**
1925         * A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.
1926         */
1927        @Child(name = "transform", type = {CanonicalType.class}, order=27, min=0, max=1, modifier=false, summary=false)
1928        @Description(shortDefinition="Transform to apply the template", formalDefinition="A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input." )
1929        protected CanonicalType transform;
1930
1931        /**
1932         * Customizations that should be applied to the statically defined resource. For example, if the dosage of a medication must be computed based on the patient's weight, a customization would be used to specify an expression that calculated the weight, and the path on the resource that would contain the result.
1933         */
1934        @Child(name = "dynamicValue", type = {}, order=28, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1935        @Description(shortDefinition="Dynamic aspects of the definition", formalDefinition="Customizations that should be applied to the statically defined resource. For example, if the dosage of a medication must be computed based on the patient's weight, a customization would be used to specify an expression that calculated the weight, and the path on the resource that would contain the result." )
1936        protected List<PlanDefinitionActionDynamicValueComponent> dynamicValue;
1937
1938        /**
1939         * Sub actions that are contained within the action. The behavior of this action determines the functionality of the sub-actions. For example, a selection behavior of at-most-one indicates that of the sub-actions, at most one may be chosen as part of realizing the action definition.
1940         */
1941        @Child(name = "action", type = {PlanDefinitionActionComponent.class}, order=29, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
1942        @Description(shortDefinition="A sub-action", formalDefinition="Sub actions that are contained within the action. The behavior of this action determines the functionality of the sub-actions. For example, a selection behavior of at-most-one indicates that of the sub-actions, at most one may be chosen as part of realizing the action definition." )
1943        protected List<PlanDefinitionActionComponent> action;
1944
1945        private static final long serialVersionUID = 1296604536L;
1946
1947    /**
1948     * Constructor
1949     */
1950      public PlanDefinitionActionComponent() {
1951        super();
1952      }
1953
1954        /**
1955         * @return {@link #linkId} (An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.). This is the underlying object with id, value and extensions. The accessor "getLinkId" gives direct access to the value
1956         */
1957        public StringType getLinkIdElement() { 
1958          if (this.linkId == null)
1959            if (Configuration.errorOnAutoCreate())
1960              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.linkId");
1961            else if (Configuration.doAutoCreate())
1962              this.linkId = new StringType(); // bb
1963          return this.linkId;
1964        }
1965
1966        public boolean hasLinkIdElement() { 
1967          return this.linkId != null && !this.linkId.isEmpty();
1968        }
1969
1970        public boolean hasLinkId() { 
1971          return this.linkId != null && !this.linkId.isEmpty();
1972        }
1973
1974        /**
1975         * @param value {@link #linkId} (An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.). This is the underlying object with id, value and extensions. The accessor "getLinkId" gives direct access to the value
1976         */
1977        public PlanDefinitionActionComponent setLinkIdElement(StringType value) { 
1978          this.linkId = value;
1979          return this;
1980        }
1981
1982        /**
1983         * @return An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.
1984         */
1985        public String getLinkId() { 
1986          return this.linkId == null ? null : this.linkId.getValue();
1987        }
1988
1989        /**
1990         * @param value An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.
1991         */
1992        public PlanDefinitionActionComponent setLinkId(String value) { 
1993          if (Utilities.noString(value))
1994            this.linkId = null;
1995          else {
1996            if (this.linkId == null)
1997              this.linkId = new StringType();
1998            this.linkId.setValue(value);
1999          }
2000          return this;
2001        }
2002
2003        /**
2004         * @return {@link #prefix} (A user-visible prefix for the action. For example a section or item numbering such as 1. or A.). This is the underlying object with id, value and extensions. The accessor "getPrefix" gives direct access to the value
2005         */
2006        public StringType getPrefixElement() { 
2007          if (this.prefix == null)
2008            if (Configuration.errorOnAutoCreate())
2009              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.prefix");
2010            else if (Configuration.doAutoCreate())
2011              this.prefix = new StringType(); // bb
2012          return this.prefix;
2013        }
2014
2015        public boolean hasPrefixElement() { 
2016          return this.prefix != null && !this.prefix.isEmpty();
2017        }
2018
2019        public boolean hasPrefix() { 
2020          return this.prefix != null && !this.prefix.isEmpty();
2021        }
2022
2023        /**
2024         * @param value {@link #prefix} (A user-visible prefix for the action. For example a section or item numbering such as 1. or A.). This is the underlying object with id, value and extensions. The accessor "getPrefix" gives direct access to the value
2025         */
2026        public PlanDefinitionActionComponent setPrefixElement(StringType value) { 
2027          this.prefix = value;
2028          return this;
2029        }
2030
2031        /**
2032         * @return A user-visible prefix for the action. For example a section or item numbering such as 1. or A.
2033         */
2034        public String getPrefix() { 
2035          return this.prefix == null ? null : this.prefix.getValue();
2036        }
2037
2038        /**
2039         * @param value A user-visible prefix for the action. For example a section or item numbering such as 1. or A.
2040         */
2041        public PlanDefinitionActionComponent setPrefix(String value) { 
2042          if (Utilities.noString(value))
2043            this.prefix = null;
2044          else {
2045            if (this.prefix == null)
2046              this.prefix = new StringType();
2047            this.prefix.setValue(value);
2048          }
2049          return this;
2050        }
2051
2052        /**
2053         * @return {@link #title} (The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
2054         */
2055        public StringType getTitleElement() { 
2056          if (this.title == null)
2057            if (Configuration.errorOnAutoCreate())
2058              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.title");
2059            else if (Configuration.doAutoCreate())
2060              this.title = new StringType(); // bb
2061          return this.title;
2062        }
2063
2064        public boolean hasTitleElement() { 
2065          return this.title != null && !this.title.isEmpty();
2066        }
2067
2068        public boolean hasTitle() { 
2069          return this.title != null && !this.title.isEmpty();
2070        }
2071
2072        /**
2073         * @param value {@link #title} (The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
2074         */
2075        public PlanDefinitionActionComponent setTitleElement(StringType value) { 
2076          this.title = value;
2077          return this;
2078        }
2079
2080        /**
2081         * @return The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.
2082         */
2083        public String getTitle() { 
2084          return this.title == null ? null : this.title.getValue();
2085        }
2086
2087        /**
2088         * @param value The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.
2089         */
2090        public PlanDefinitionActionComponent setTitle(String value) { 
2091          if (Utilities.noString(value))
2092            this.title = null;
2093          else {
2094            if (this.title == null)
2095              this.title = new StringType();
2096            this.title.setValue(value);
2097          }
2098          return this;
2099        }
2100
2101        /**
2102         * @return {@link #description} (A brief description of the action used to provide a summary to display to the user.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2103         */
2104        public MarkdownType getDescriptionElement() { 
2105          if (this.description == null)
2106            if (Configuration.errorOnAutoCreate())
2107              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.description");
2108            else if (Configuration.doAutoCreate())
2109              this.description = new MarkdownType(); // bb
2110          return this.description;
2111        }
2112
2113        public boolean hasDescriptionElement() { 
2114          return this.description != null && !this.description.isEmpty();
2115        }
2116
2117        public boolean hasDescription() { 
2118          return this.description != null && !this.description.isEmpty();
2119        }
2120
2121        /**
2122         * @param value {@link #description} (A brief description of the action used to provide a summary to display to the user.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
2123         */
2124        public PlanDefinitionActionComponent setDescriptionElement(MarkdownType value) { 
2125          this.description = value;
2126          return this;
2127        }
2128
2129        /**
2130         * @return A brief description of the action used to provide a summary to display to the user.
2131         */
2132        public String getDescription() { 
2133          return this.description == null ? null : this.description.getValue();
2134        }
2135
2136        /**
2137         * @param value A brief description of the action used to provide a summary to display to the user.
2138         */
2139        public PlanDefinitionActionComponent setDescription(String value) { 
2140          if (Utilities.noString(value))
2141            this.description = null;
2142          else {
2143            if (this.description == null)
2144              this.description = new MarkdownType();
2145            this.description.setValue(value);
2146          }
2147          return this;
2148        }
2149
2150        /**
2151         * @return {@link #textEquivalent} (A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.). This is the underlying object with id, value and extensions. The accessor "getTextEquivalent" gives direct access to the value
2152         */
2153        public MarkdownType getTextEquivalentElement() { 
2154          if (this.textEquivalent == null)
2155            if (Configuration.errorOnAutoCreate())
2156              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.textEquivalent");
2157            else if (Configuration.doAutoCreate())
2158              this.textEquivalent = new MarkdownType(); // bb
2159          return this.textEquivalent;
2160        }
2161
2162        public boolean hasTextEquivalentElement() { 
2163          return this.textEquivalent != null && !this.textEquivalent.isEmpty();
2164        }
2165
2166        public boolean hasTextEquivalent() { 
2167          return this.textEquivalent != null && !this.textEquivalent.isEmpty();
2168        }
2169
2170        /**
2171         * @param value {@link #textEquivalent} (A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.). This is the underlying object with id, value and extensions. The accessor "getTextEquivalent" gives direct access to the value
2172         */
2173        public PlanDefinitionActionComponent setTextEquivalentElement(MarkdownType value) { 
2174          this.textEquivalent = value;
2175          return this;
2176        }
2177
2178        /**
2179         * @return A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.
2180         */
2181        public String getTextEquivalent() { 
2182          return this.textEquivalent == null ? null : this.textEquivalent.getValue();
2183        }
2184
2185        /**
2186         * @param value A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.
2187         */
2188        public PlanDefinitionActionComponent setTextEquivalent(String value) { 
2189          if (Utilities.noString(value))
2190            this.textEquivalent = null;
2191          else {
2192            if (this.textEquivalent == null)
2193              this.textEquivalent = new MarkdownType();
2194            this.textEquivalent.setValue(value);
2195          }
2196          return this;
2197        }
2198
2199        /**
2200         * @return {@link #priority} (Indicates how quickly the action should be addressed with respect to other actions.). This is the underlying object with id, value and extensions. The accessor "getPriority" gives direct access to the value
2201         */
2202        public Enumeration<RequestPriority> getPriorityElement() { 
2203          if (this.priority == null)
2204            if (Configuration.errorOnAutoCreate())
2205              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.priority");
2206            else if (Configuration.doAutoCreate())
2207              this.priority = new Enumeration<RequestPriority>(new RequestPriorityEnumFactory()); // bb
2208          return this.priority;
2209        }
2210
2211        public boolean hasPriorityElement() { 
2212          return this.priority != null && !this.priority.isEmpty();
2213        }
2214
2215        public boolean hasPriority() { 
2216          return this.priority != null && !this.priority.isEmpty();
2217        }
2218
2219        /**
2220         * @param value {@link #priority} (Indicates how quickly the action should be addressed with respect to other actions.). This is the underlying object with id, value and extensions. The accessor "getPriority" gives direct access to the value
2221         */
2222        public PlanDefinitionActionComponent setPriorityElement(Enumeration<RequestPriority> value) { 
2223          this.priority = value;
2224          return this;
2225        }
2226
2227        /**
2228         * @return Indicates how quickly the action should be addressed with respect to other actions.
2229         */
2230        public RequestPriority getPriority() { 
2231          return this.priority == null ? null : this.priority.getValue();
2232        }
2233
2234        /**
2235         * @param value Indicates how quickly the action should be addressed with respect to other actions.
2236         */
2237        public PlanDefinitionActionComponent setPriority(RequestPriority value) { 
2238          if (value == null)
2239            this.priority = null;
2240          else {
2241            if (this.priority == null)
2242              this.priority = new Enumeration<RequestPriority>(new RequestPriorityEnumFactory());
2243            this.priority.setValue(value);
2244          }
2245          return this;
2246        }
2247
2248        /**
2249         * @return {@link #code} (A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property.)
2250         */
2251        public CodeableConcept getCode() { 
2252          if (this.code == null)
2253            if (Configuration.errorOnAutoCreate())
2254              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.code");
2255            else if (Configuration.doAutoCreate())
2256              this.code = new CodeableConcept(); // cc
2257          return this.code;
2258        }
2259
2260        public boolean hasCode() { 
2261          return this.code != null && !this.code.isEmpty();
2262        }
2263
2264        /**
2265         * @param value {@link #code} (A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property.)
2266         */
2267        public PlanDefinitionActionComponent setCode(CodeableConcept value) { 
2268          this.code = value;
2269          return this;
2270        }
2271
2272        /**
2273         * @return {@link #reason} (A description of why this action is necessary or appropriate.)
2274         */
2275        public List<CodeableConcept> getReason() { 
2276          if (this.reason == null)
2277            this.reason = new ArrayList<CodeableConcept>();
2278          return this.reason;
2279        }
2280
2281        /**
2282         * @return Returns a reference to <code>this</code> for easy method chaining
2283         */
2284        public PlanDefinitionActionComponent setReason(List<CodeableConcept> theReason) { 
2285          this.reason = theReason;
2286          return this;
2287        }
2288
2289        public boolean hasReason() { 
2290          if (this.reason == null)
2291            return false;
2292          for (CodeableConcept item : this.reason)
2293            if (!item.isEmpty())
2294              return true;
2295          return false;
2296        }
2297
2298        public CodeableConcept addReason() { //3
2299          CodeableConcept t = new CodeableConcept();
2300          if (this.reason == null)
2301            this.reason = new ArrayList<CodeableConcept>();
2302          this.reason.add(t);
2303          return t;
2304        }
2305
2306        public PlanDefinitionActionComponent addReason(CodeableConcept t) { //3
2307          if (t == null)
2308            return this;
2309          if (this.reason == null)
2310            this.reason = new ArrayList<CodeableConcept>();
2311          this.reason.add(t);
2312          return this;
2313        }
2314
2315        /**
2316         * @return The first repetition of repeating field {@link #reason}, creating it if it does not already exist {3}
2317         */
2318        public CodeableConcept getReasonFirstRep() { 
2319          if (getReason().isEmpty()) {
2320            addReason();
2321          }
2322          return getReason().get(0);
2323        }
2324
2325        /**
2326         * @return {@link #documentation} (Didactic or other informational resources associated with the action that can be provided to the CDS recipient. Information resources can include inline text commentary and links to web resources.)
2327         */
2328        public List<RelatedArtifact> getDocumentation() { 
2329          if (this.documentation == null)
2330            this.documentation = new ArrayList<RelatedArtifact>();
2331          return this.documentation;
2332        }
2333
2334        /**
2335         * @return Returns a reference to <code>this</code> for easy method chaining
2336         */
2337        public PlanDefinitionActionComponent setDocumentation(List<RelatedArtifact> theDocumentation) { 
2338          this.documentation = theDocumentation;
2339          return this;
2340        }
2341
2342        public boolean hasDocumentation() { 
2343          if (this.documentation == null)
2344            return false;
2345          for (RelatedArtifact item : this.documentation)
2346            if (!item.isEmpty())
2347              return true;
2348          return false;
2349        }
2350
2351        public RelatedArtifact addDocumentation() { //3
2352          RelatedArtifact t = new RelatedArtifact();
2353          if (this.documentation == null)
2354            this.documentation = new ArrayList<RelatedArtifact>();
2355          this.documentation.add(t);
2356          return t;
2357        }
2358
2359        public PlanDefinitionActionComponent addDocumentation(RelatedArtifact t) { //3
2360          if (t == null)
2361            return this;
2362          if (this.documentation == null)
2363            this.documentation = new ArrayList<RelatedArtifact>();
2364          this.documentation.add(t);
2365          return this;
2366        }
2367
2368        /**
2369         * @return The first repetition of repeating field {@link #documentation}, creating it if it does not already exist {3}
2370         */
2371        public RelatedArtifact getDocumentationFirstRep() { 
2372          if (getDocumentation().isEmpty()) {
2373            addDocumentation();
2374          }
2375          return getDocumentation().get(0);
2376        }
2377
2378        /**
2379         * @return {@link #goalId} (Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.)
2380         */
2381        public List<IdType> getGoalId() { 
2382          if (this.goalId == null)
2383            this.goalId = new ArrayList<IdType>();
2384          return this.goalId;
2385        }
2386
2387        /**
2388         * @return Returns a reference to <code>this</code> for easy method chaining
2389         */
2390        public PlanDefinitionActionComponent setGoalId(List<IdType> theGoalId) { 
2391          this.goalId = theGoalId;
2392          return this;
2393        }
2394
2395        public boolean hasGoalId() { 
2396          if (this.goalId == null)
2397            return false;
2398          for (IdType item : this.goalId)
2399            if (!item.isEmpty())
2400              return true;
2401          return false;
2402        }
2403
2404        /**
2405         * @return {@link #goalId} (Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.)
2406         */
2407        public IdType addGoalIdElement() {//2 
2408          IdType t = new IdType();
2409          if (this.goalId == null)
2410            this.goalId = new ArrayList<IdType>();
2411          this.goalId.add(t);
2412          return t;
2413        }
2414
2415        /**
2416         * @param value {@link #goalId} (Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.)
2417         */
2418        public PlanDefinitionActionComponent addGoalId(String value) { //1
2419          IdType t = new IdType();
2420          t.setValue(value);
2421          if (this.goalId == null)
2422            this.goalId = new ArrayList<IdType>();
2423          this.goalId.add(t);
2424          return this;
2425        }
2426
2427        /**
2428         * @param value {@link #goalId} (Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.)
2429         */
2430        public boolean hasGoalId(String value) { 
2431          if (this.goalId == null)
2432            return false;
2433          for (IdType v : this.goalId)
2434            if (v.getValue().equals(value)) // id
2435              return true;
2436          return false;
2437        }
2438
2439        /**
2440         * @return {@link #subject} (A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
2441         */
2442        public DataType getSubject() { 
2443          return this.subject;
2444        }
2445
2446        /**
2447         * @return {@link #subject} (A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
2448         */
2449        public CodeableConcept getSubjectCodeableConcept() throws FHIRException { 
2450          if (this.subject == null)
2451            this.subject = new CodeableConcept();
2452          if (!(this.subject instanceof CodeableConcept))
2453            throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.subject.getClass().getName()+" was encountered");
2454          return (CodeableConcept) this.subject;
2455        }
2456
2457        public boolean hasSubjectCodeableConcept() { 
2458          return this != null && this.subject instanceof CodeableConcept;
2459        }
2460
2461        /**
2462         * @return {@link #subject} (A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
2463         */
2464        public Reference getSubjectReference() throws FHIRException { 
2465          if (this.subject == null)
2466            this.subject = new Reference();
2467          if (!(this.subject instanceof Reference))
2468            throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.subject.getClass().getName()+" was encountered");
2469          return (Reference) this.subject;
2470        }
2471
2472        public boolean hasSubjectReference() { 
2473          return this != null && this.subject instanceof Reference;
2474        }
2475
2476        /**
2477         * @return {@link #subject} (A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
2478         */
2479        public CanonicalType getSubjectCanonicalType() throws FHIRException { 
2480          if (this.subject == null)
2481            this.subject = new CanonicalType();
2482          if (!(this.subject instanceof CanonicalType))
2483            throw new FHIRException("Type mismatch: the type CanonicalType was expected, but "+this.subject.getClass().getName()+" was encountered");
2484          return (CanonicalType) this.subject;
2485        }
2486
2487        public boolean hasSubjectCanonicalType() { 
2488          return this != null && this.subject instanceof CanonicalType;
2489        }
2490
2491        public boolean hasSubject() { 
2492          return this.subject != null && !this.subject.isEmpty();
2493        }
2494
2495        /**
2496         * @param value {@link #subject} (A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
2497         */
2498        public PlanDefinitionActionComponent setSubject(DataType value) { 
2499          if (value != null && !(value instanceof CodeableConcept || value instanceof Reference || value instanceof CanonicalType))
2500            throw new FHIRException("Not the right type for PlanDefinition.action.subject[x]: "+value.fhirType());
2501          this.subject = value;
2502          return this;
2503        }
2504
2505        /**
2506         * @return {@link #trigger} (A description of when the action should be triggered. When multiple triggers are specified on an action, any triggering event invokes the action.)
2507         */
2508        public List<TriggerDefinition> getTrigger() { 
2509          if (this.trigger == null)
2510            this.trigger = new ArrayList<TriggerDefinition>();
2511          return this.trigger;
2512        }
2513
2514        /**
2515         * @return Returns a reference to <code>this</code> for easy method chaining
2516         */
2517        public PlanDefinitionActionComponent setTrigger(List<TriggerDefinition> theTrigger) { 
2518          this.trigger = theTrigger;
2519          return this;
2520        }
2521
2522        public boolean hasTrigger() { 
2523          if (this.trigger == null)
2524            return false;
2525          for (TriggerDefinition item : this.trigger)
2526            if (!item.isEmpty())
2527              return true;
2528          return false;
2529        }
2530
2531        public TriggerDefinition addTrigger() { //3
2532          TriggerDefinition t = new TriggerDefinition();
2533          if (this.trigger == null)
2534            this.trigger = new ArrayList<TriggerDefinition>();
2535          this.trigger.add(t);
2536          return t;
2537        }
2538
2539        public PlanDefinitionActionComponent addTrigger(TriggerDefinition t) { //3
2540          if (t == null)
2541            return this;
2542          if (this.trigger == null)
2543            this.trigger = new ArrayList<TriggerDefinition>();
2544          this.trigger.add(t);
2545          return this;
2546        }
2547
2548        /**
2549         * @return The first repetition of repeating field {@link #trigger}, creating it if it does not already exist {3}
2550         */
2551        public TriggerDefinition getTriggerFirstRep() { 
2552          if (getTrigger().isEmpty()) {
2553            addTrigger();
2554          }
2555          return getTrigger().get(0);
2556        }
2557
2558        /**
2559         * @return {@link #condition} (An expression that describes applicability criteria or start/stop conditions for the action.)
2560         */
2561        public List<PlanDefinitionActionConditionComponent> getCondition() { 
2562          if (this.condition == null)
2563            this.condition = new ArrayList<PlanDefinitionActionConditionComponent>();
2564          return this.condition;
2565        }
2566
2567        /**
2568         * @return Returns a reference to <code>this</code> for easy method chaining
2569         */
2570        public PlanDefinitionActionComponent setCondition(List<PlanDefinitionActionConditionComponent> theCondition) { 
2571          this.condition = theCondition;
2572          return this;
2573        }
2574
2575        public boolean hasCondition() { 
2576          if (this.condition == null)
2577            return false;
2578          for (PlanDefinitionActionConditionComponent item : this.condition)
2579            if (!item.isEmpty())
2580              return true;
2581          return false;
2582        }
2583
2584        public PlanDefinitionActionConditionComponent addCondition() { //3
2585          PlanDefinitionActionConditionComponent t = new PlanDefinitionActionConditionComponent();
2586          if (this.condition == null)
2587            this.condition = new ArrayList<PlanDefinitionActionConditionComponent>();
2588          this.condition.add(t);
2589          return t;
2590        }
2591
2592        public PlanDefinitionActionComponent addCondition(PlanDefinitionActionConditionComponent t) { //3
2593          if (t == null)
2594            return this;
2595          if (this.condition == null)
2596            this.condition = new ArrayList<PlanDefinitionActionConditionComponent>();
2597          this.condition.add(t);
2598          return this;
2599        }
2600
2601        /**
2602         * @return The first repetition of repeating field {@link #condition}, creating it if it does not already exist {3}
2603         */
2604        public PlanDefinitionActionConditionComponent getConditionFirstRep() { 
2605          if (getCondition().isEmpty()) {
2606            addCondition();
2607          }
2608          return getCondition().get(0);
2609        }
2610
2611        /**
2612         * @return {@link #input} (Defines input data requirements for the action.)
2613         */
2614        public List<PlanDefinitionActionInputComponent> getInput() { 
2615          if (this.input == null)
2616            this.input = new ArrayList<PlanDefinitionActionInputComponent>();
2617          return this.input;
2618        }
2619
2620        /**
2621         * @return Returns a reference to <code>this</code> for easy method chaining
2622         */
2623        public PlanDefinitionActionComponent setInput(List<PlanDefinitionActionInputComponent> theInput) { 
2624          this.input = theInput;
2625          return this;
2626        }
2627
2628        public boolean hasInput() { 
2629          if (this.input == null)
2630            return false;
2631          for (PlanDefinitionActionInputComponent item : this.input)
2632            if (!item.isEmpty())
2633              return true;
2634          return false;
2635        }
2636
2637        public PlanDefinitionActionInputComponent addInput() { //3
2638          PlanDefinitionActionInputComponent t = new PlanDefinitionActionInputComponent();
2639          if (this.input == null)
2640            this.input = new ArrayList<PlanDefinitionActionInputComponent>();
2641          this.input.add(t);
2642          return t;
2643        }
2644
2645        public PlanDefinitionActionComponent addInput(PlanDefinitionActionInputComponent t) { //3
2646          if (t == null)
2647            return this;
2648          if (this.input == null)
2649            this.input = new ArrayList<PlanDefinitionActionInputComponent>();
2650          this.input.add(t);
2651          return this;
2652        }
2653
2654        /**
2655         * @return The first repetition of repeating field {@link #input}, creating it if it does not already exist {3}
2656         */
2657        public PlanDefinitionActionInputComponent getInputFirstRep() { 
2658          if (getInput().isEmpty()) {
2659            addInput();
2660          }
2661          return getInput().get(0);
2662        }
2663
2664        /**
2665         * @return {@link #output} (Defines the outputs of the action, if any.)
2666         */
2667        public List<PlanDefinitionActionOutputComponent> getOutput() { 
2668          if (this.output == null)
2669            this.output = new ArrayList<PlanDefinitionActionOutputComponent>();
2670          return this.output;
2671        }
2672
2673        /**
2674         * @return Returns a reference to <code>this</code> for easy method chaining
2675         */
2676        public PlanDefinitionActionComponent setOutput(List<PlanDefinitionActionOutputComponent> theOutput) { 
2677          this.output = theOutput;
2678          return this;
2679        }
2680
2681        public boolean hasOutput() { 
2682          if (this.output == null)
2683            return false;
2684          for (PlanDefinitionActionOutputComponent item : this.output)
2685            if (!item.isEmpty())
2686              return true;
2687          return false;
2688        }
2689
2690        public PlanDefinitionActionOutputComponent addOutput() { //3
2691          PlanDefinitionActionOutputComponent t = new PlanDefinitionActionOutputComponent();
2692          if (this.output == null)
2693            this.output = new ArrayList<PlanDefinitionActionOutputComponent>();
2694          this.output.add(t);
2695          return t;
2696        }
2697
2698        public PlanDefinitionActionComponent addOutput(PlanDefinitionActionOutputComponent t) { //3
2699          if (t == null)
2700            return this;
2701          if (this.output == null)
2702            this.output = new ArrayList<PlanDefinitionActionOutputComponent>();
2703          this.output.add(t);
2704          return this;
2705        }
2706
2707        /**
2708         * @return The first repetition of repeating field {@link #output}, creating it if it does not already exist {3}
2709         */
2710        public PlanDefinitionActionOutputComponent getOutputFirstRep() { 
2711          if (getOutput().isEmpty()) {
2712            addOutput();
2713          }
2714          return getOutput().get(0);
2715        }
2716
2717        /**
2718         * @return {@link #relatedAction} (A relationship to another action such as "before" or "30-60 minutes after start of".)
2719         */
2720        public List<PlanDefinitionActionRelatedActionComponent> getRelatedAction() { 
2721          if (this.relatedAction == null)
2722            this.relatedAction = new ArrayList<PlanDefinitionActionRelatedActionComponent>();
2723          return this.relatedAction;
2724        }
2725
2726        /**
2727         * @return Returns a reference to <code>this</code> for easy method chaining
2728         */
2729        public PlanDefinitionActionComponent setRelatedAction(List<PlanDefinitionActionRelatedActionComponent> theRelatedAction) { 
2730          this.relatedAction = theRelatedAction;
2731          return this;
2732        }
2733
2734        public boolean hasRelatedAction() { 
2735          if (this.relatedAction == null)
2736            return false;
2737          for (PlanDefinitionActionRelatedActionComponent item : this.relatedAction)
2738            if (!item.isEmpty())
2739              return true;
2740          return false;
2741        }
2742
2743        public PlanDefinitionActionRelatedActionComponent addRelatedAction() { //3
2744          PlanDefinitionActionRelatedActionComponent t = new PlanDefinitionActionRelatedActionComponent();
2745          if (this.relatedAction == null)
2746            this.relatedAction = new ArrayList<PlanDefinitionActionRelatedActionComponent>();
2747          this.relatedAction.add(t);
2748          return t;
2749        }
2750
2751        public PlanDefinitionActionComponent addRelatedAction(PlanDefinitionActionRelatedActionComponent t) { //3
2752          if (t == null)
2753            return this;
2754          if (this.relatedAction == null)
2755            this.relatedAction = new ArrayList<PlanDefinitionActionRelatedActionComponent>();
2756          this.relatedAction.add(t);
2757          return this;
2758        }
2759
2760        /**
2761         * @return The first repetition of repeating field {@link #relatedAction}, creating it if it does not already exist {3}
2762         */
2763        public PlanDefinitionActionRelatedActionComponent getRelatedActionFirstRep() { 
2764          if (getRelatedAction().isEmpty()) {
2765            addRelatedAction();
2766          }
2767          return getRelatedAction().get(0);
2768        }
2769
2770        /**
2771         * @return {@link #timing} (An optional value describing when the action should be performed.)
2772         */
2773        public DataType getTiming() { 
2774          return this.timing;
2775        }
2776
2777        /**
2778         * @return {@link #timing} (An optional value describing when the action should be performed.)
2779         */
2780        public Age getTimingAge() throws FHIRException { 
2781          if (this.timing == null)
2782            this.timing = new Age();
2783          if (!(this.timing instanceof Age))
2784            throw new FHIRException("Type mismatch: the type Age was expected, but "+this.timing.getClass().getName()+" was encountered");
2785          return (Age) this.timing;
2786        }
2787
2788        public boolean hasTimingAge() { 
2789          return this != null && this.timing instanceof Age;
2790        }
2791
2792        /**
2793         * @return {@link #timing} (An optional value describing when the action should be performed.)
2794         */
2795        public Duration getTimingDuration() throws FHIRException { 
2796          if (this.timing == null)
2797            this.timing = new Duration();
2798          if (!(this.timing instanceof Duration))
2799            throw new FHIRException("Type mismatch: the type Duration was expected, but "+this.timing.getClass().getName()+" was encountered");
2800          return (Duration) this.timing;
2801        }
2802
2803        public boolean hasTimingDuration() { 
2804          return this != null && this.timing instanceof Duration;
2805        }
2806
2807        /**
2808         * @return {@link #timing} (An optional value describing when the action should be performed.)
2809         */
2810        public Range getTimingRange() throws FHIRException { 
2811          if (this.timing == null)
2812            this.timing = new Range();
2813          if (!(this.timing instanceof Range))
2814            throw new FHIRException("Type mismatch: the type Range was expected, but "+this.timing.getClass().getName()+" was encountered");
2815          return (Range) this.timing;
2816        }
2817
2818        public boolean hasTimingRange() { 
2819          return this != null && this.timing instanceof Range;
2820        }
2821
2822        /**
2823         * @return {@link #timing} (An optional value describing when the action should be performed.)
2824         */
2825        public Timing getTimingTiming() throws FHIRException { 
2826          if (this.timing == null)
2827            this.timing = new Timing();
2828          if (!(this.timing instanceof Timing))
2829            throw new FHIRException("Type mismatch: the type Timing was expected, but "+this.timing.getClass().getName()+" was encountered");
2830          return (Timing) this.timing;
2831        }
2832
2833        public boolean hasTimingTiming() { 
2834          return this != null && this.timing instanceof Timing;
2835        }
2836
2837        public boolean hasTiming() { 
2838          return this.timing != null && !this.timing.isEmpty();
2839        }
2840
2841        /**
2842         * @param value {@link #timing} (An optional value describing when the action should be performed.)
2843         */
2844        public PlanDefinitionActionComponent setTiming(DataType value) { 
2845          if (value != null && !(value instanceof Age || value instanceof Duration || value instanceof Range || value instanceof Timing))
2846            throw new FHIRException("Not the right type for PlanDefinition.action.timing[x]: "+value.fhirType());
2847          this.timing = value;
2848          return this;
2849        }
2850
2851        /**
2852         * @return {@link #location} (Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc.)
2853         */
2854        public CodeableReference getLocation() { 
2855          if (this.location == null)
2856            if (Configuration.errorOnAutoCreate())
2857              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.location");
2858            else if (Configuration.doAutoCreate())
2859              this.location = new CodeableReference(); // cc
2860          return this.location;
2861        }
2862
2863        public boolean hasLocation() { 
2864          return this.location != null && !this.location.isEmpty();
2865        }
2866
2867        /**
2868         * @param value {@link #location} (Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc.)
2869         */
2870        public PlanDefinitionActionComponent setLocation(CodeableReference value) { 
2871          this.location = value;
2872          return this;
2873        }
2874
2875        /**
2876         * @return {@link #participant} (Indicates who should participate in performing the action described.)
2877         */
2878        public List<PlanDefinitionActionParticipantComponent> getParticipant() { 
2879          if (this.participant == null)
2880            this.participant = new ArrayList<PlanDefinitionActionParticipantComponent>();
2881          return this.participant;
2882        }
2883
2884        /**
2885         * @return Returns a reference to <code>this</code> for easy method chaining
2886         */
2887        public PlanDefinitionActionComponent setParticipant(List<PlanDefinitionActionParticipantComponent> theParticipant) { 
2888          this.participant = theParticipant;
2889          return this;
2890        }
2891
2892        public boolean hasParticipant() { 
2893          if (this.participant == null)
2894            return false;
2895          for (PlanDefinitionActionParticipantComponent item : this.participant)
2896            if (!item.isEmpty())
2897              return true;
2898          return false;
2899        }
2900
2901        public PlanDefinitionActionParticipantComponent addParticipant() { //3
2902          PlanDefinitionActionParticipantComponent t = new PlanDefinitionActionParticipantComponent();
2903          if (this.participant == null)
2904            this.participant = new ArrayList<PlanDefinitionActionParticipantComponent>();
2905          this.participant.add(t);
2906          return t;
2907        }
2908
2909        public PlanDefinitionActionComponent addParticipant(PlanDefinitionActionParticipantComponent t) { //3
2910          if (t == null)
2911            return this;
2912          if (this.participant == null)
2913            this.participant = new ArrayList<PlanDefinitionActionParticipantComponent>();
2914          this.participant.add(t);
2915          return this;
2916        }
2917
2918        /**
2919         * @return The first repetition of repeating field {@link #participant}, creating it if it does not already exist {3}
2920         */
2921        public PlanDefinitionActionParticipantComponent getParticipantFirstRep() { 
2922          if (getParticipant().isEmpty()) {
2923            addParticipant();
2924          }
2925          return getParticipant().get(0);
2926        }
2927
2928        /**
2929         * @return {@link #type} (The type of action to perform (create, update, remove).)
2930         */
2931        public CodeableConcept getType() { 
2932          if (this.type == null)
2933            if (Configuration.errorOnAutoCreate())
2934              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.type");
2935            else if (Configuration.doAutoCreate())
2936              this.type = new CodeableConcept(); // cc
2937          return this.type;
2938        }
2939
2940        public boolean hasType() { 
2941          return this.type != null && !this.type.isEmpty();
2942        }
2943
2944        /**
2945         * @param value {@link #type} (The type of action to perform (create, update, remove).)
2946         */
2947        public PlanDefinitionActionComponent setType(CodeableConcept value) { 
2948          this.type = value;
2949          return this;
2950        }
2951
2952        /**
2953         * @return {@link #groupingBehavior} (Defines the grouping behavior for the action and its children.). This is the underlying object with id, value and extensions. The accessor "getGroupingBehavior" gives direct access to the value
2954         */
2955        public Enumeration<ActionGroupingBehavior> getGroupingBehaviorElement() { 
2956          if (this.groupingBehavior == null)
2957            if (Configuration.errorOnAutoCreate())
2958              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.groupingBehavior");
2959            else if (Configuration.doAutoCreate())
2960              this.groupingBehavior = new Enumeration<ActionGroupingBehavior>(new ActionGroupingBehaviorEnumFactory()); // bb
2961          return this.groupingBehavior;
2962        }
2963
2964        public boolean hasGroupingBehaviorElement() { 
2965          return this.groupingBehavior != null && !this.groupingBehavior.isEmpty();
2966        }
2967
2968        public boolean hasGroupingBehavior() { 
2969          return this.groupingBehavior != null && !this.groupingBehavior.isEmpty();
2970        }
2971
2972        /**
2973         * @param value {@link #groupingBehavior} (Defines the grouping behavior for the action and its children.). This is the underlying object with id, value and extensions. The accessor "getGroupingBehavior" gives direct access to the value
2974         */
2975        public PlanDefinitionActionComponent setGroupingBehaviorElement(Enumeration<ActionGroupingBehavior> value) { 
2976          this.groupingBehavior = value;
2977          return this;
2978        }
2979
2980        /**
2981         * @return Defines the grouping behavior for the action and its children.
2982         */
2983        public ActionGroupingBehavior getGroupingBehavior() { 
2984          return this.groupingBehavior == null ? null : this.groupingBehavior.getValue();
2985        }
2986
2987        /**
2988         * @param value Defines the grouping behavior for the action and its children.
2989         */
2990        public PlanDefinitionActionComponent setGroupingBehavior(ActionGroupingBehavior value) { 
2991          if (value == null)
2992            this.groupingBehavior = null;
2993          else {
2994            if (this.groupingBehavior == null)
2995              this.groupingBehavior = new Enumeration<ActionGroupingBehavior>(new ActionGroupingBehaviorEnumFactory());
2996            this.groupingBehavior.setValue(value);
2997          }
2998          return this;
2999        }
3000
3001        /**
3002         * @return {@link #selectionBehavior} (Defines the selection behavior for the action and its children.). This is the underlying object with id, value and extensions. The accessor "getSelectionBehavior" gives direct access to the value
3003         */
3004        public Enumeration<ActionSelectionBehavior> getSelectionBehaviorElement() { 
3005          if (this.selectionBehavior == null)
3006            if (Configuration.errorOnAutoCreate())
3007              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.selectionBehavior");
3008            else if (Configuration.doAutoCreate())
3009              this.selectionBehavior = new Enumeration<ActionSelectionBehavior>(new ActionSelectionBehaviorEnumFactory()); // bb
3010          return this.selectionBehavior;
3011        }
3012
3013        public boolean hasSelectionBehaviorElement() { 
3014          return this.selectionBehavior != null && !this.selectionBehavior.isEmpty();
3015        }
3016
3017        public boolean hasSelectionBehavior() { 
3018          return this.selectionBehavior != null && !this.selectionBehavior.isEmpty();
3019        }
3020
3021        /**
3022         * @param value {@link #selectionBehavior} (Defines the selection behavior for the action and its children.). This is the underlying object with id, value and extensions. The accessor "getSelectionBehavior" gives direct access to the value
3023         */
3024        public PlanDefinitionActionComponent setSelectionBehaviorElement(Enumeration<ActionSelectionBehavior> value) { 
3025          this.selectionBehavior = value;
3026          return this;
3027        }
3028
3029        /**
3030         * @return Defines the selection behavior for the action and its children.
3031         */
3032        public ActionSelectionBehavior getSelectionBehavior() { 
3033          return this.selectionBehavior == null ? null : this.selectionBehavior.getValue();
3034        }
3035
3036        /**
3037         * @param value Defines the selection behavior for the action and its children.
3038         */
3039        public PlanDefinitionActionComponent setSelectionBehavior(ActionSelectionBehavior value) { 
3040          if (value == null)
3041            this.selectionBehavior = null;
3042          else {
3043            if (this.selectionBehavior == null)
3044              this.selectionBehavior = new Enumeration<ActionSelectionBehavior>(new ActionSelectionBehaviorEnumFactory());
3045            this.selectionBehavior.setValue(value);
3046          }
3047          return this;
3048        }
3049
3050        /**
3051         * @return {@link #requiredBehavior} (Defines the required behavior for the action.). This is the underlying object with id, value and extensions. The accessor "getRequiredBehavior" gives direct access to the value
3052         */
3053        public Enumeration<ActionRequiredBehavior> getRequiredBehaviorElement() { 
3054          if (this.requiredBehavior == null)
3055            if (Configuration.errorOnAutoCreate())
3056              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.requiredBehavior");
3057            else if (Configuration.doAutoCreate())
3058              this.requiredBehavior = new Enumeration<ActionRequiredBehavior>(new ActionRequiredBehaviorEnumFactory()); // bb
3059          return this.requiredBehavior;
3060        }
3061
3062        public boolean hasRequiredBehaviorElement() { 
3063          return this.requiredBehavior != null && !this.requiredBehavior.isEmpty();
3064        }
3065
3066        public boolean hasRequiredBehavior() { 
3067          return this.requiredBehavior != null && !this.requiredBehavior.isEmpty();
3068        }
3069
3070        /**
3071         * @param value {@link #requiredBehavior} (Defines the required behavior for the action.). This is the underlying object with id, value and extensions. The accessor "getRequiredBehavior" gives direct access to the value
3072         */
3073        public PlanDefinitionActionComponent setRequiredBehaviorElement(Enumeration<ActionRequiredBehavior> value) { 
3074          this.requiredBehavior = value;
3075          return this;
3076        }
3077
3078        /**
3079         * @return Defines the required behavior for the action.
3080         */
3081        public ActionRequiredBehavior getRequiredBehavior() { 
3082          return this.requiredBehavior == null ? null : this.requiredBehavior.getValue();
3083        }
3084
3085        /**
3086         * @param value Defines the required behavior for the action.
3087         */
3088        public PlanDefinitionActionComponent setRequiredBehavior(ActionRequiredBehavior value) { 
3089          if (value == null)
3090            this.requiredBehavior = null;
3091          else {
3092            if (this.requiredBehavior == null)
3093              this.requiredBehavior = new Enumeration<ActionRequiredBehavior>(new ActionRequiredBehaviorEnumFactory());
3094            this.requiredBehavior.setValue(value);
3095          }
3096          return this;
3097        }
3098
3099        /**
3100         * @return {@link #precheckBehavior} (Defines whether the action should usually be preselected.). This is the underlying object with id, value and extensions. The accessor "getPrecheckBehavior" gives direct access to the value
3101         */
3102        public Enumeration<ActionPrecheckBehavior> getPrecheckBehaviorElement() { 
3103          if (this.precheckBehavior == null)
3104            if (Configuration.errorOnAutoCreate())
3105              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.precheckBehavior");
3106            else if (Configuration.doAutoCreate())
3107              this.precheckBehavior = new Enumeration<ActionPrecheckBehavior>(new ActionPrecheckBehaviorEnumFactory()); // bb
3108          return this.precheckBehavior;
3109        }
3110
3111        public boolean hasPrecheckBehaviorElement() { 
3112          return this.precheckBehavior != null && !this.precheckBehavior.isEmpty();
3113        }
3114
3115        public boolean hasPrecheckBehavior() { 
3116          return this.precheckBehavior != null && !this.precheckBehavior.isEmpty();
3117        }
3118
3119        /**
3120         * @param value {@link #precheckBehavior} (Defines whether the action should usually be preselected.). This is the underlying object with id, value and extensions. The accessor "getPrecheckBehavior" gives direct access to the value
3121         */
3122        public PlanDefinitionActionComponent setPrecheckBehaviorElement(Enumeration<ActionPrecheckBehavior> value) { 
3123          this.precheckBehavior = value;
3124          return this;
3125        }
3126
3127        /**
3128         * @return Defines whether the action should usually be preselected.
3129         */
3130        public ActionPrecheckBehavior getPrecheckBehavior() { 
3131          return this.precheckBehavior == null ? null : this.precheckBehavior.getValue();
3132        }
3133
3134        /**
3135         * @param value Defines whether the action should usually be preselected.
3136         */
3137        public PlanDefinitionActionComponent setPrecheckBehavior(ActionPrecheckBehavior value) { 
3138          if (value == null)
3139            this.precheckBehavior = null;
3140          else {
3141            if (this.precheckBehavior == null)
3142              this.precheckBehavior = new Enumeration<ActionPrecheckBehavior>(new ActionPrecheckBehaviorEnumFactory());
3143            this.precheckBehavior.setValue(value);
3144          }
3145          return this;
3146        }
3147
3148        /**
3149         * @return {@link #cardinalityBehavior} (Defines whether the action can be selected multiple times.). This is the underlying object with id, value and extensions. The accessor "getCardinalityBehavior" gives direct access to the value
3150         */
3151        public Enumeration<ActionCardinalityBehavior> getCardinalityBehaviorElement() { 
3152          if (this.cardinalityBehavior == null)
3153            if (Configuration.errorOnAutoCreate())
3154              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.cardinalityBehavior");
3155            else if (Configuration.doAutoCreate())
3156              this.cardinalityBehavior = new Enumeration<ActionCardinalityBehavior>(new ActionCardinalityBehaviorEnumFactory()); // bb
3157          return this.cardinalityBehavior;
3158        }
3159
3160        public boolean hasCardinalityBehaviorElement() { 
3161          return this.cardinalityBehavior != null && !this.cardinalityBehavior.isEmpty();
3162        }
3163
3164        public boolean hasCardinalityBehavior() { 
3165          return this.cardinalityBehavior != null && !this.cardinalityBehavior.isEmpty();
3166        }
3167
3168        /**
3169         * @param value {@link #cardinalityBehavior} (Defines whether the action can be selected multiple times.). This is the underlying object with id, value and extensions. The accessor "getCardinalityBehavior" gives direct access to the value
3170         */
3171        public PlanDefinitionActionComponent setCardinalityBehaviorElement(Enumeration<ActionCardinalityBehavior> value) { 
3172          this.cardinalityBehavior = value;
3173          return this;
3174        }
3175
3176        /**
3177         * @return Defines whether the action can be selected multiple times.
3178         */
3179        public ActionCardinalityBehavior getCardinalityBehavior() { 
3180          return this.cardinalityBehavior == null ? null : this.cardinalityBehavior.getValue();
3181        }
3182
3183        /**
3184         * @param value Defines whether the action can be selected multiple times.
3185         */
3186        public PlanDefinitionActionComponent setCardinalityBehavior(ActionCardinalityBehavior value) { 
3187          if (value == null)
3188            this.cardinalityBehavior = null;
3189          else {
3190            if (this.cardinalityBehavior == null)
3191              this.cardinalityBehavior = new Enumeration<ActionCardinalityBehavior>(new ActionCardinalityBehaviorEnumFactory());
3192            this.cardinalityBehavior.setValue(value);
3193          }
3194          return this;
3195        }
3196
3197        /**
3198         * @return {@link #definition} (A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.)
3199         */
3200        public DataType getDefinition() { 
3201          return this.definition;
3202        }
3203
3204        /**
3205         * @return {@link #definition} (A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.)
3206         */
3207        public CanonicalType getDefinitionCanonicalType() throws FHIRException { 
3208          if (this.definition == null)
3209            this.definition = new CanonicalType();
3210          if (!(this.definition instanceof CanonicalType))
3211            throw new FHIRException("Type mismatch: the type CanonicalType was expected, but "+this.definition.getClass().getName()+" was encountered");
3212          return (CanonicalType) this.definition;
3213        }
3214
3215        public boolean hasDefinitionCanonicalType() { 
3216          return this != null && this.definition instanceof CanonicalType;
3217        }
3218
3219        /**
3220         * @return {@link #definition} (A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.)
3221         */
3222        public UriType getDefinitionUriType() throws FHIRException { 
3223          if (this.definition == null)
3224            this.definition = new UriType();
3225          if (!(this.definition instanceof UriType))
3226            throw new FHIRException("Type mismatch: the type UriType was expected, but "+this.definition.getClass().getName()+" was encountered");
3227          return (UriType) this.definition;
3228        }
3229
3230        public boolean hasDefinitionUriType() { 
3231          return this != null && this.definition instanceof UriType;
3232        }
3233
3234        public boolean hasDefinition() { 
3235          return this.definition != null && !this.definition.isEmpty();
3236        }
3237
3238        /**
3239         * @param value {@link #definition} (A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.)
3240         */
3241        public PlanDefinitionActionComponent setDefinition(DataType value) { 
3242          if (value != null && !(value instanceof CanonicalType || value instanceof UriType))
3243            throw new FHIRException("Not the right type for PlanDefinition.action.definition[x]: "+value.fhirType());
3244          this.definition = value;
3245          return this;
3246        }
3247
3248        /**
3249         * @return {@link #transform} (A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.). This is the underlying object with id, value and extensions. The accessor "getTransform" gives direct access to the value
3250         */
3251        public CanonicalType getTransformElement() { 
3252          if (this.transform == null)
3253            if (Configuration.errorOnAutoCreate())
3254              throw new Error("Attempt to auto-create PlanDefinitionActionComponent.transform");
3255            else if (Configuration.doAutoCreate())
3256              this.transform = new CanonicalType(); // bb
3257          return this.transform;
3258        }
3259
3260        public boolean hasTransformElement() { 
3261          return this.transform != null && !this.transform.isEmpty();
3262        }
3263
3264        public boolean hasTransform() { 
3265          return this.transform != null && !this.transform.isEmpty();
3266        }
3267
3268        /**
3269         * @param value {@link #transform} (A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.). This is the underlying object with id, value and extensions. The accessor "getTransform" gives direct access to the value
3270         */
3271        public PlanDefinitionActionComponent setTransformElement(CanonicalType value) { 
3272          this.transform = value;
3273          return this;
3274        }
3275
3276        /**
3277         * @return A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.
3278         */
3279        public String getTransform() { 
3280          return this.transform == null ? null : this.transform.getValue();
3281        }
3282
3283        /**
3284         * @param value A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.
3285         */
3286        public PlanDefinitionActionComponent setTransform(String value) { 
3287          if (Utilities.noString(value))
3288            this.transform = null;
3289          else {
3290            if (this.transform == null)
3291              this.transform = new CanonicalType();
3292            this.transform.setValue(value);
3293          }
3294          return this;
3295        }
3296
3297        /**
3298         * @return {@link #dynamicValue} (Customizations that should be applied to the statically defined resource. For example, if the dosage of a medication must be computed based on the patient's weight, a customization would be used to specify an expression that calculated the weight, and the path on the resource that would contain the result.)
3299         */
3300        public List<PlanDefinitionActionDynamicValueComponent> getDynamicValue() { 
3301          if (this.dynamicValue == null)
3302            this.dynamicValue = new ArrayList<PlanDefinitionActionDynamicValueComponent>();
3303          return this.dynamicValue;
3304        }
3305
3306        /**
3307         * @return Returns a reference to <code>this</code> for easy method chaining
3308         */
3309        public PlanDefinitionActionComponent setDynamicValue(List<PlanDefinitionActionDynamicValueComponent> theDynamicValue) { 
3310          this.dynamicValue = theDynamicValue;
3311          return this;
3312        }
3313
3314        public boolean hasDynamicValue() { 
3315          if (this.dynamicValue == null)
3316            return false;
3317          for (PlanDefinitionActionDynamicValueComponent item : this.dynamicValue)
3318            if (!item.isEmpty())
3319              return true;
3320          return false;
3321        }
3322
3323        public PlanDefinitionActionDynamicValueComponent addDynamicValue() { //3
3324          PlanDefinitionActionDynamicValueComponent t = new PlanDefinitionActionDynamicValueComponent();
3325          if (this.dynamicValue == null)
3326            this.dynamicValue = new ArrayList<PlanDefinitionActionDynamicValueComponent>();
3327          this.dynamicValue.add(t);
3328          return t;
3329        }
3330
3331        public PlanDefinitionActionComponent addDynamicValue(PlanDefinitionActionDynamicValueComponent t) { //3
3332          if (t == null)
3333            return this;
3334          if (this.dynamicValue == null)
3335            this.dynamicValue = new ArrayList<PlanDefinitionActionDynamicValueComponent>();
3336          this.dynamicValue.add(t);
3337          return this;
3338        }
3339
3340        /**
3341         * @return The first repetition of repeating field {@link #dynamicValue}, creating it if it does not already exist {3}
3342         */
3343        public PlanDefinitionActionDynamicValueComponent getDynamicValueFirstRep() { 
3344          if (getDynamicValue().isEmpty()) {
3345            addDynamicValue();
3346          }
3347          return getDynamicValue().get(0);
3348        }
3349
3350        /**
3351         * @return {@link #action} (Sub actions that are contained within the action. The behavior of this action determines the functionality of the sub-actions. For example, a selection behavior of at-most-one indicates that of the sub-actions, at most one may be chosen as part of realizing the action definition.)
3352         */
3353        public List<PlanDefinitionActionComponent> getAction() { 
3354          if (this.action == null)
3355            this.action = new ArrayList<PlanDefinitionActionComponent>();
3356          return this.action;
3357        }
3358
3359        /**
3360         * @return Returns a reference to <code>this</code> for easy method chaining
3361         */
3362        public PlanDefinitionActionComponent setAction(List<PlanDefinitionActionComponent> theAction) { 
3363          this.action = theAction;
3364          return this;
3365        }
3366
3367        public boolean hasAction() { 
3368          if (this.action == null)
3369            return false;
3370          for (PlanDefinitionActionComponent item : this.action)
3371            if (!item.isEmpty())
3372              return true;
3373          return false;
3374        }
3375
3376        public PlanDefinitionActionComponent addAction() { //3
3377          PlanDefinitionActionComponent t = new PlanDefinitionActionComponent();
3378          if (this.action == null)
3379            this.action = new ArrayList<PlanDefinitionActionComponent>();
3380          this.action.add(t);
3381          return t;
3382        }
3383
3384        public PlanDefinitionActionComponent addAction(PlanDefinitionActionComponent t) { //3
3385          if (t == null)
3386            return this;
3387          if (this.action == null)
3388            this.action = new ArrayList<PlanDefinitionActionComponent>();
3389          this.action.add(t);
3390          return this;
3391        }
3392
3393        /**
3394         * @return The first repetition of repeating field {@link #action}, creating it if it does not already exist {3}
3395         */
3396        public PlanDefinitionActionComponent getActionFirstRep() { 
3397          if (getAction().isEmpty()) {
3398            addAction();
3399          }
3400          return getAction().get(0);
3401        }
3402
3403        protected void listChildren(List<Property> children) {
3404          super.listChildren(children);
3405          children.add(new Property("linkId", "string", "An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.", 0, 1, linkId));
3406          children.add(new Property("prefix", "string", "A user-visible prefix for the action. For example a section or item numbering such as 1. or A.", 0, 1, prefix));
3407          children.add(new Property("title", "string", "The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.", 0, 1, title));
3408          children.add(new Property("description", "markdown", "A brief description of the action used to provide a summary to display to the user.", 0, 1, description));
3409          children.add(new Property("textEquivalent", "markdown", "A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.", 0, 1, textEquivalent));
3410          children.add(new Property("priority", "code", "Indicates how quickly the action should be addressed with respect to other actions.", 0, 1, priority));
3411          children.add(new Property("code", "CodeableConcept", "A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property.", 0, 1, code));
3412          children.add(new Property("reason", "CodeableConcept", "A description of why this action is necessary or appropriate.", 0, java.lang.Integer.MAX_VALUE, reason));
3413          children.add(new Property("documentation", "RelatedArtifact", "Didactic or other informational resources associated with the action that can be provided to the CDS recipient. Information resources can include inline text commentary and links to web resources.", 0, java.lang.Integer.MAX_VALUE, documentation));
3414          children.add(new Property("goalId", "id", "Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.", 0, java.lang.Integer.MAX_VALUE, goalId));
3415          children.add(new Property("subject[x]", "CodeableConcept|Reference(Group)|canonical", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject));
3416          children.add(new Property("trigger", "TriggerDefinition", "A description of when the action should be triggered. When multiple triggers are specified on an action, any triggering event invokes the action.", 0, java.lang.Integer.MAX_VALUE, trigger));
3417          children.add(new Property("condition", "", "An expression that describes applicability criteria or start/stop conditions for the action.", 0, java.lang.Integer.MAX_VALUE, condition));
3418          children.add(new Property("input", "", "Defines input data requirements for the action.", 0, java.lang.Integer.MAX_VALUE, input));
3419          children.add(new Property("output", "", "Defines the outputs of the action, if any.", 0, java.lang.Integer.MAX_VALUE, output));
3420          children.add(new Property("relatedAction", "", "A relationship to another action such as \"before\" or \"30-60 minutes after start of\".", 0, java.lang.Integer.MAX_VALUE, relatedAction));
3421          children.add(new Property("timing[x]", "Age|Duration|Range|Timing", "An optional value describing when the action should be performed.", 0, 1, timing));
3422          children.add(new Property("location", "CodeableReference(Location)", "Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc.", 0, 1, location));
3423          children.add(new Property("participant", "", "Indicates who should participate in performing the action described.", 0, java.lang.Integer.MAX_VALUE, participant));
3424          children.add(new Property("type", "CodeableConcept", "The type of action to perform (create, update, remove).", 0, 1, type));
3425          children.add(new Property("groupingBehavior", "code", "Defines the grouping behavior for the action and its children.", 0, 1, groupingBehavior));
3426          children.add(new Property("selectionBehavior", "code", "Defines the selection behavior for the action and its children.", 0, 1, selectionBehavior));
3427          children.add(new Property("requiredBehavior", "code", "Defines the required behavior for the action.", 0, 1, requiredBehavior));
3428          children.add(new Property("precheckBehavior", "code", "Defines whether the action should usually be preselected.", 0, 1, precheckBehavior));
3429          children.add(new Property("cardinalityBehavior", "code", "Defines whether the action can be selected multiple times.", 0, 1, cardinalityBehavior));
3430          children.add(new Property("definition[x]", "canonical(ActivityDefinition|MessageDefinition|ObservationDefinition|PlanDefinition|Questionnaire|SpecimenDefinition)|uri", "A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.", 0, 1, definition));
3431          children.add(new Property("transform", "canonical(StructureMap)", "A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.", 0, 1, transform));
3432          children.add(new Property("dynamicValue", "", "Customizations that should be applied to the statically defined resource. For example, if the dosage of a medication must be computed based on the patient's weight, a customization would be used to specify an expression that calculated the weight, and the path on the resource that would contain the result.", 0, java.lang.Integer.MAX_VALUE, dynamicValue));
3433          children.add(new Property("action", "@PlanDefinition.action", "Sub actions that are contained within the action. The behavior of this action determines the functionality of the sub-actions. For example, a selection behavior of at-most-one indicates that of the sub-actions, at most one may be chosen as part of realizing the action definition.", 0, java.lang.Integer.MAX_VALUE, action));
3434        }
3435
3436        @Override
3437        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
3438          switch (_hash) {
3439          case -1102667083: /*linkId*/  return new Property("linkId", "string", "An identifier that is unique within the PlanDefinition to allow linkage within the realized CarePlan and/or RequestOrchestration.", 0, 1, linkId);
3440          case -980110702: /*prefix*/  return new Property("prefix", "string", "A user-visible prefix for the action. For example a section or item numbering such as 1. or A.", 0, 1, prefix);
3441          case 110371416: /*title*/  return new Property("title", "string", "The textual description of the action displayed to a user. For example, when the action is a test to be performed, the title would be the title of the test such as Assay by HPLC.", 0, 1, title);
3442          case -1724546052: /*description*/  return new Property("description", "markdown", "A brief description of the action used to provide a summary to display to the user.", 0, 1, description);
3443          case -900391049: /*textEquivalent*/  return new Property("textEquivalent", "markdown", "A text equivalent of the action to be performed. This provides a human-interpretable description of the action when the definition is consumed by a system that might not be capable of interpreting it dynamically.", 0, 1, textEquivalent);
3444          case -1165461084: /*priority*/  return new Property("priority", "code", "Indicates how quickly the action should be addressed with respect to other actions.", 0, 1, priority);
3445          case 3059181: /*code*/  return new Property("code", "CodeableConcept", "A code that provides a meaning, grouping, or classification for the action or action group. For example, a section may have a LOINC code for the section of a documentation template. In pharmaceutical quality, an action (Test) such as pH could be classified as a physical property.", 0, 1, code);
3446          case -934964668: /*reason*/  return new Property("reason", "CodeableConcept", "A description of why this action is necessary or appropriate.", 0, java.lang.Integer.MAX_VALUE, reason);
3447          case 1587405498: /*documentation*/  return new Property("documentation", "RelatedArtifact", "Didactic or other informational resources associated with the action that can be provided to the CDS recipient. Information resources can include inline text commentary and links to web resources.", 0, java.lang.Integer.MAX_VALUE, documentation);
3448          case -1240658034: /*goalId*/  return new Property("goalId", "id", "Identifies goals that this action supports. The reference must be to a goal element defined within this plan definition. In pharmaceutical quality, a goal represents acceptance criteria (Goal) for a given action (Test), so the goalId would be the unique id of a defined goal element establishing the acceptance criteria for the action.", 0, java.lang.Integer.MAX_VALUE, goalId);
3449          case -573640748: /*subject[x]*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)|canonical", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
3450          case -1867885268: /*subject*/  return new Property("subject[x]", "CodeableConcept|Reference(Group)|canonical", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
3451          case -1257122603: /*subjectCodeableConcept*/  return new Property("subject[x]", "CodeableConcept", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
3452          case 772938623: /*subjectReference*/  return new Property("subject[x]", "Reference(Group)", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
3453          case -1768521432: /*subjectCanonical*/  return new Property("subject[x]", "canonical", "A code, group definition, or canonical reference that describes the intended subject of the action and its children, if any. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
3454          case -1059891784: /*trigger*/  return new Property("trigger", "TriggerDefinition", "A description of when the action should be triggered. When multiple triggers are specified on an action, any triggering event invokes the action.", 0, java.lang.Integer.MAX_VALUE, trigger);
3455          case -861311717: /*condition*/  return new Property("condition", "", "An expression that describes applicability criteria or start/stop conditions for the action.", 0, java.lang.Integer.MAX_VALUE, condition);
3456          case 100358090: /*input*/  return new Property("input", "", "Defines input data requirements for the action.", 0, java.lang.Integer.MAX_VALUE, input);
3457          case -1005512447: /*output*/  return new Property("output", "", "Defines the outputs of the action, if any.", 0, java.lang.Integer.MAX_VALUE, output);
3458          case -384107967: /*relatedAction*/  return new Property("relatedAction", "", "A relationship to another action such as \"before\" or \"30-60 minutes after start of\".", 0, java.lang.Integer.MAX_VALUE, relatedAction);
3459          case 164632566: /*timing[x]*/  return new Property("timing[x]", "Age|Duration|Range|Timing", "An optional value describing when the action should be performed.", 0, 1, timing);
3460          case -873664438: /*timing*/  return new Property("timing[x]", "Age|Duration|Range|Timing", "An optional value describing when the action should be performed.", 0, 1, timing);
3461          case 164607061: /*timingAge*/  return new Property("timing[x]", "Age", "An optional value describing when the action should be performed.", 0, 1, timing);
3462          case -1327253506: /*timingDuration*/  return new Property("timing[x]", "Duration", "An optional value describing when the action should be performed.", 0, 1, timing);
3463          case -710871277: /*timingRange*/  return new Property("timing[x]", "Range", "An optional value describing when the action should be performed.", 0, 1, timing);
3464          case -497554124: /*timingTiming*/  return new Property("timing[x]", "Timing", "An optional value describing when the action should be performed.", 0, 1, timing);
3465          case 1901043637: /*location*/  return new Property("location", "CodeableReference(Location)", "Identifies the facility where the action will occur; e.g. home, hospital, specific clinic, etc.", 0, 1, location);
3466          case 767422259: /*participant*/  return new Property("participant", "", "Indicates who should participate in performing the action described.", 0, java.lang.Integer.MAX_VALUE, participant);
3467          case 3575610: /*type*/  return new Property("type", "CodeableConcept", "The type of action to perform (create, update, remove).", 0, 1, type);
3468          case 586678389: /*groupingBehavior*/  return new Property("groupingBehavior", "code", "Defines the grouping behavior for the action and its children.", 0, 1, groupingBehavior);
3469          case 168639486: /*selectionBehavior*/  return new Property("selectionBehavior", "code", "Defines the selection behavior for the action and its children.", 0, 1, selectionBehavior);
3470          case -1163906287: /*requiredBehavior*/  return new Property("requiredBehavior", "code", "Defines the required behavior for the action.", 0, 1, requiredBehavior);
3471          case -1174249033: /*precheckBehavior*/  return new Property("precheckBehavior", "code", "Defines whether the action should usually be preselected.", 0, 1, precheckBehavior);
3472          case -922577408: /*cardinalityBehavior*/  return new Property("cardinalityBehavior", "code", "Defines whether the action can be selected multiple times.", 0, 1, cardinalityBehavior);
3473          case -1139422643: /*definition[x]*/  return new Property("definition[x]", "canonical(ActivityDefinition|MessageDefinition|ObservationDefinition|PlanDefinition|Questionnaire|SpecimenDefinition)|uri", "A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.", 0, 1, definition);
3474          case -1014418093: /*definition*/  return new Property("definition[x]", "canonical(ActivityDefinition|MessageDefinition|ObservationDefinition|PlanDefinition|Questionnaire|SpecimenDefinition)|uri", "A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.", 0, 1, definition);
3475          case 933485793: /*definitionCanonical*/  return new Property("definition[x]", "canonical(ActivityDefinition|MessageDefinition|ObservationDefinition|PlanDefinition|Questionnaire|SpecimenDefinition)", "A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.", 0, 1, definition);
3476          case -1139428583: /*definitionUri*/  return new Property("definition[x]", "uri", "A reference to an ActivityDefinition that describes the action to be taken in detail, a MessageDefinition describing a message to be snet, a PlanDefinition that describes a series of actions to be taken, a Questionnaire that should be filled out, a SpecimenDefinition describing a specimen to be collected, or an ObservationDefinition that specifies what observation should be captured.", 0, 1, definition);
3477          case 1052666732: /*transform*/  return new Property("transform", "canonical(StructureMap)", "A reference to a StructureMap resource that defines a transform that can be executed to produce the intent resource using the ActivityDefinition instance as the input.", 0, 1, transform);
3478          case 572625010: /*dynamicValue*/  return new Property("dynamicValue", "", "Customizations that should be applied to the statically defined resource. For example, if the dosage of a medication must be computed based on the patient's weight, a customization would be used to specify an expression that calculated the weight, and the path on the resource that would contain the result.", 0, java.lang.Integer.MAX_VALUE, dynamicValue);
3479          case -1422950858: /*action*/  return new Property("action", "@PlanDefinition.action", "Sub actions that are contained within the action. The behavior of this action determines the functionality of the sub-actions. For example, a selection behavior of at-most-one indicates that of the sub-actions, at most one may be chosen as part of realizing the action definition.", 0, java.lang.Integer.MAX_VALUE, action);
3480          default: return super.getNamedProperty(_hash, _name, _checkValid);
3481          }
3482
3483        }
3484
3485      @Override
3486      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
3487        switch (hash) {
3488        case -1102667083: /*linkId*/ return this.linkId == null ? new Base[0] : new Base[] {this.linkId}; // StringType
3489        case -980110702: /*prefix*/ return this.prefix == null ? new Base[0] : new Base[] {this.prefix}; // StringType
3490        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
3491        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
3492        case -900391049: /*textEquivalent*/ return this.textEquivalent == null ? new Base[0] : new Base[] {this.textEquivalent}; // MarkdownType
3493        case -1165461084: /*priority*/ return this.priority == null ? new Base[0] : new Base[] {this.priority}; // Enumeration<RequestPriority>
3494        case 3059181: /*code*/ return this.code == null ? new Base[0] : new Base[] {this.code}; // CodeableConcept
3495        case -934964668: /*reason*/ return this.reason == null ? new Base[0] : this.reason.toArray(new Base[this.reason.size()]); // CodeableConcept
3496        case 1587405498: /*documentation*/ return this.documentation == null ? new Base[0] : this.documentation.toArray(new Base[this.documentation.size()]); // RelatedArtifact
3497        case -1240658034: /*goalId*/ return this.goalId == null ? new Base[0] : this.goalId.toArray(new Base[this.goalId.size()]); // IdType
3498        case -1867885268: /*subject*/ return this.subject == null ? new Base[0] : new Base[] {this.subject}; // DataType
3499        case -1059891784: /*trigger*/ return this.trigger == null ? new Base[0] : this.trigger.toArray(new Base[this.trigger.size()]); // TriggerDefinition
3500        case -861311717: /*condition*/ return this.condition == null ? new Base[0] : this.condition.toArray(new Base[this.condition.size()]); // PlanDefinitionActionConditionComponent
3501        case 100358090: /*input*/ return this.input == null ? new Base[0] : this.input.toArray(new Base[this.input.size()]); // PlanDefinitionActionInputComponent
3502        case -1005512447: /*output*/ return this.output == null ? new Base[0] : this.output.toArray(new Base[this.output.size()]); // PlanDefinitionActionOutputComponent
3503        case -384107967: /*relatedAction*/ return this.relatedAction == null ? new Base[0] : this.relatedAction.toArray(new Base[this.relatedAction.size()]); // PlanDefinitionActionRelatedActionComponent
3504        case -873664438: /*timing*/ return this.timing == null ? new Base[0] : new Base[] {this.timing}; // DataType
3505        case 1901043637: /*location*/ return this.location == null ? new Base[0] : new Base[] {this.location}; // CodeableReference
3506        case 767422259: /*participant*/ return this.participant == null ? new Base[0] : this.participant.toArray(new Base[this.participant.size()]); // PlanDefinitionActionParticipantComponent
3507        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
3508        case 586678389: /*groupingBehavior*/ return this.groupingBehavior == null ? new Base[0] : new Base[] {this.groupingBehavior}; // Enumeration<ActionGroupingBehavior>
3509        case 168639486: /*selectionBehavior*/ return this.selectionBehavior == null ? new Base[0] : new Base[] {this.selectionBehavior}; // Enumeration<ActionSelectionBehavior>
3510        case -1163906287: /*requiredBehavior*/ return this.requiredBehavior == null ? new Base[0] : new Base[] {this.requiredBehavior}; // Enumeration<ActionRequiredBehavior>
3511        case -1174249033: /*precheckBehavior*/ return this.precheckBehavior == null ? new Base[0] : new Base[] {this.precheckBehavior}; // Enumeration<ActionPrecheckBehavior>
3512        case -922577408: /*cardinalityBehavior*/ return this.cardinalityBehavior == null ? new Base[0] : new Base[] {this.cardinalityBehavior}; // Enumeration<ActionCardinalityBehavior>
3513        case -1014418093: /*definition*/ return this.definition == null ? new Base[0] : new Base[] {this.definition}; // DataType
3514        case 1052666732: /*transform*/ return this.transform == null ? new Base[0] : new Base[] {this.transform}; // CanonicalType
3515        case 572625010: /*dynamicValue*/ return this.dynamicValue == null ? new Base[0] : this.dynamicValue.toArray(new Base[this.dynamicValue.size()]); // PlanDefinitionActionDynamicValueComponent
3516        case -1422950858: /*action*/ return this.action == null ? new Base[0] : this.action.toArray(new Base[this.action.size()]); // PlanDefinitionActionComponent
3517        default: return super.getProperty(hash, name, checkValid);
3518        }
3519
3520      }
3521
3522      @Override
3523      public Base setProperty(int hash, String name, Base value) throws FHIRException {
3524        switch (hash) {
3525        case -1102667083: // linkId
3526          this.linkId = TypeConvertor.castToString(value); // StringType
3527          return value;
3528        case -980110702: // prefix
3529          this.prefix = TypeConvertor.castToString(value); // StringType
3530          return value;
3531        case 110371416: // title
3532          this.title = TypeConvertor.castToString(value); // StringType
3533          return value;
3534        case -1724546052: // description
3535          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
3536          return value;
3537        case -900391049: // textEquivalent
3538          this.textEquivalent = TypeConvertor.castToMarkdown(value); // MarkdownType
3539          return value;
3540        case -1165461084: // priority
3541          value = new RequestPriorityEnumFactory().fromType(TypeConvertor.castToCode(value));
3542          this.priority = (Enumeration) value; // Enumeration<RequestPriority>
3543          return value;
3544        case 3059181: // code
3545          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3546          return value;
3547        case -934964668: // reason
3548          this.getReason().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
3549          return value;
3550        case 1587405498: // documentation
3551          this.getDocumentation().add(TypeConvertor.castToRelatedArtifact(value)); // RelatedArtifact
3552          return value;
3553        case -1240658034: // goalId
3554          this.getGoalId().add(TypeConvertor.castToId(value)); // IdType
3555          return value;
3556        case -1867885268: // subject
3557          this.subject = TypeConvertor.castToType(value); // DataType
3558          return value;
3559        case -1059891784: // trigger
3560          this.getTrigger().add(TypeConvertor.castToTriggerDefinition(value)); // TriggerDefinition
3561          return value;
3562        case -861311717: // condition
3563          this.getCondition().add((PlanDefinitionActionConditionComponent) value); // PlanDefinitionActionConditionComponent
3564          return value;
3565        case 100358090: // input
3566          this.getInput().add((PlanDefinitionActionInputComponent) value); // PlanDefinitionActionInputComponent
3567          return value;
3568        case -1005512447: // output
3569          this.getOutput().add((PlanDefinitionActionOutputComponent) value); // PlanDefinitionActionOutputComponent
3570          return value;
3571        case -384107967: // relatedAction
3572          this.getRelatedAction().add((PlanDefinitionActionRelatedActionComponent) value); // PlanDefinitionActionRelatedActionComponent
3573          return value;
3574        case -873664438: // timing
3575          this.timing = TypeConvertor.castToType(value); // DataType
3576          return value;
3577        case 1901043637: // location
3578          this.location = TypeConvertor.castToCodeableReference(value); // CodeableReference
3579          return value;
3580        case 767422259: // participant
3581          this.getParticipant().add((PlanDefinitionActionParticipantComponent) value); // PlanDefinitionActionParticipantComponent
3582          return value;
3583        case 3575610: // type
3584          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3585          return value;
3586        case 586678389: // groupingBehavior
3587          value = new ActionGroupingBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3588          this.groupingBehavior = (Enumeration) value; // Enumeration<ActionGroupingBehavior>
3589          return value;
3590        case 168639486: // selectionBehavior
3591          value = new ActionSelectionBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3592          this.selectionBehavior = (Enumeration) value; // Enumeration<ActionSelectionBehavior>
3593          return value;
3594        case -1163906287: // requiredBehavior
3595          value = new ActionRequiredBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3596          this.requiredBehavior = (Enumeration) value; // Enumeration<ActionRequiredBehavior>
3597          return value;
3598        case -1174249033: // precheckBehavior
3599          value = new ActionPrecheckBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3600          this.precheckBehavior = (Enumeration) value; // Enumeration<ActionPrecheckBehavior>
3601          return value;
3602        case -922577408: // cardinalityBehavior
3603          value = new ActionCardinalityBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3604          this.cardinalityBehavior = (Enumeration) value; // Enumeration<ActionCardinalityBehavior>
3605          return value;
3606        case -1014418093: // definition
3607          this.definition = TypeConvertor.castToType(value); // DataType
3608          return value;
3609        case 1052666732: // transform
3610          this.transform = TypeConvertor.castToCanonical(value); // CanonicalType
3611          return value;
3612        case 572625010: // dynamicValue
3613          this.getDynamicValue().add((PlanDefinitionActionDynamicValueComponent) value); // PlanDefinitionActionDynamicValueComponent
3614          return value;
3615        case -1422950858: // action
3616          this.getAction().add((PlanDefinitionActionComponent) value); // PlanDefinitionActionComponent
3617          return value;
3618        default: return super.setProperty(hash, name, value);
3619        }
3620
3621      }
3622
3623      @Override
3624      public Base setProperty(String name, Base value) throws FHIRException {
3625        if (name.equals("linkId")) {
3626          this.linkId = TypeConvertor.castToString(value); // StringType
3627        } else if (name.equals("prefix")) {
3628          this.prefix = TypeConvertor.castToString(value); // StringType
3629        } else if (name.equals("title")) {
3630          this.title = TypeConvertor.castToString(value); // StringType
3631        } else if (name.equals("description")) {
3632          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
3633        } else if (name.equals("textEquivalent")) {
3634          this.textEquivalent = TypeConvertor.castToMarkdown(value); // MarkdownType
3635        } else if (name.equals("priority")) {
3636          value = new RequestPriorityEnumFactory().fromType(TypeConvertor.castToCode(value));
3637          this.priority = (Enumeration) value; // Enumeration<RequestPriority>
3638        } else if (name.equals("code")) {
3639          this.code = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3640        } else if (name.equals("reason")) {
3641          this.getReason().add(TypeConvertor.castToCodeableConcept(value));
3642        } else if (name.equals("documentation")) {
3643          this.getDocumentation().add(TypeConvertor.castToRelatedArtifact(value));
3644        } else if (name.equals("goalId")) {
3645          this.getGoalId().add(TypeConvertor.castToId(value));
3646        } else if (name.equals("subject[x]")) {
3647          this.subject = TypeConvertor.castToType(value); // DataType
3648        } else if (name.equals("trigger")) {
3649          this.getTrigger().add(TypeConvertor.castToTriggerDefinition(value));
3650        } else if (name.equals("condition")) {
3651          this.getCondition().add((PlanDefinitionActionConditionComponent) value);
3652        } else if (name.equals("input")) {
3653          this.getInput().add((PlanDefinitionActionInputComponent) value);
3654        } else if (name.equals("output")) {
3655          this.getOutput().add((PlanDefinitionActionOutputComponent) value);
3656        } else if (name.equals("relatedAction")) {
3657          this.getRelatedAction().add((PlanDefinitionActionRelatedActionComponent) value);
3658        } else if (name.equals("timing[x]")) {
3659          this.timing = TypeConvertor.castToType(value); // DataType
3660        } else if (name.equals("location")) {
3661          this.location = TypeConvertor.castToCodeableReference(value); // CodeableReference
3662        } else if (name.equals("participant")) {
3663          this.getParticipant().add((PlanDefinitionActionParticipantComponent) value);
3664        } else if (name.equals("type")) {
3665          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
3666        } else if (name.equals("groupingBehavior")) {
3667          value = new ActionGroupingBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3668          this.groupingBehavior = (Enumeration) value; // Enumeration<ActionGroupingBehavior>
3669        } else if (name.equals("selectionBehavior")) {
3670          value = new ActionSelectionBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3671          this.selectionBehavior = (Enumeration) value; // Enumeration<ActionSelectionBehavior>
3672        } else if (name.equals("requiredBehavior")) {
3673          value = new ActionRequiredBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3674          this.requiredBehavior = (Enumeration) value; // Enumeration<ActionRequiredBehavior>
3675        } else if (name.equals("precheckBehavior")) {
3676          value = new ActionPrecheckBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3677          this.precheckBehavior = (Enumeration) value; // Enumeration<ActionPrecheckBehavior>
3678        } else if (name.equals("cardinalityBehavior")) {
3679          value = new ActionCardinalityBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3680          this.cardinalityBehavior = (Enumeration) value; // Enumeration<ActionCardinalityBehavior>
3681        } else if (name.equals("definition[x]")) {
3682          this.definition = TypeConvertor.castToType(value); // DataType
3683        } else if (name.equals("transform")) {
3684          this.transform = TypeConvertor.castToCanonical(value); // CanonicalType
3685        } else if (name.equals("dynamicValue")) {
3686          this.getDynamicValue().add((PlanDefinitionActionDynamicValueComponent) value);
3687        } else if (name.equals("action")) {
3688          this.getAction().add((PlanDefinitionActionComponent) value);
3689        } else
3690          return super.setProperty(name, value);
3691        return value;
3692      }
3693
3694  @Override
3695  public void removeChild(String name, Base value) throws FHIRException {
3696        if (name.equals("linkId")) {
3697          this.linkId = null;
3698        } else if (name.equals("prefix")) {
3699          this.prefix = null;
3700        } else if (name.equals("title")) {
3701          this.title = null;
3702        } else if (name.equals("description")) {
3703          this.description = null;
3704        } else if (name.equals("textEquivalent")) {
3705          this.textEquivalent = null;
3706        } else if (name.equals("priority")) {
3707          value = new RequestPriorityEnumFactory().fromType(TypeConvertor.castToCode(value));
3708          this.priority = (Enumeration) value; // Enumeration<RequestPriority>
3709        } else if (name.equals("code")) {
3710          this.code = null;
3711        } else if (name.equals("reason")) {
3712          this.getReason().remove(value);
3713        } else if (name.equals("documentation")) {
3714          this.getDocumentation().remove(value);
3715        } else if (name.equals("goalId")) {
3716          this.getGoalId().remove(value);
3717        } else if (name.equals("subject[x]")) {
3718          this.subject = null;
3719        } else if (name.equals("trigger")) {
3720          this.getTrigger().remove(value);
3721        } else if (name.equals("condition")) {
3722          this.getCondition().remove((PlanDefinitionActionConditionComponent) value);
3723        } else if (name.equals("input")) {
3724          this.getInput().remove((PlanDefinitionActionInputComponent) value);
3725        } else if (name.equals("output")) {
3726          this.getOutput().remove((PlanDefinitionActionOutputComponent) value);
3727        } else if (name.equals("relatedAction")) {
3728          this.getRelatedAction().remove((PlanDefinitionActionRelatedActionComponent) value);
3729        } else if (name.equals("timing[x]")) {
3730          this.timing = null;
3731        } else if (name.equals("location")) {
3732          this.location = null;
3733        } else if (name.equals("participant")) {
3734          this.getParticipant().remove((PlanDefinitionActionParticipantComponent) value);
3735        } else if (name.equals("type")) {
3736          this.type = null;
3737        } else if (name.equals("groupingBehavior")) {
3738          value = new ActionGroupingBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3739          this.groupingBehavior = (Enumeration) value; // Enumeration<ActionGroupingBehavior>
3740        } else if (name.equals("selectionBehavior")) {
3741          value = new ActionSelectionBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3742          this.selectionBehavior = (Enumeration) value; // Enumeration<ActionSelectionBehavior>
3743        } else if (name.equals("requiredBehavior")) {
3744          value = new ActionRequiredBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3745          this.requiredBehavior = (Enumeration) value; // Enumeration<ActionRequiredBehavior>
3746        } else if (name.equals("precheckBehavior")) {
3747          value = new ActionPrecheckBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3748          this.precheckBehavior = (Enumeration) value; // Enumeration<ActionPrecheckBehavior>
3749        } else if (name.equals("cardinalityBehavior")) {
3750          value = new ActionCardinalityBehaviorEnumFactory().fromType(TypeConvertor.castToCode(value));
3751          this.cardinalityBehavior = (Enumeration) value; // Enumeration<ActionCardinalityBehavior>
3752        } else if (name.equals("definition[x]")) {
3753          this.definition = null;
3754        } else if (name.equals("transform")) {
3755          this.transform = null;
3756        } else if (name.equals("dynamicValue")) {
3757          this.getDynamicValue().remove((PlanDefinitionActionDynamicValueComponent) value);
3758        } else if (name.equals("action")) {
3759          this.getAction().remove((PlanDefinitionActionComponent) value);
3760        } else
3761          super.removeChild(name, value);
3762        
3763      }
3764
3765      @Override
3766      public Base makeProperty(int hash, String name) throws FHIRException {
3767        switch (hash) {
3768        case -1102667083:  return getLinkIdElement();
3769        case -980110702:  return getPrefixElement();
3770        case 110371416:  return getTitleElement();
3771        case -1724546052:  return getDescriptionElement();
3772        case -900391049:  return getTextEquivalentElement();
3773        case -1165461084:  return getPriorityElement();
3774        case 3059181:  return getCode();
3775        case -934964668:  return addReason(); 
3776        case 1587405498:  return addDocumentation(); 
3777        case -1240658034:  return addGoalIdElement();
3778        case -573640748:  return getSubject();
3779        case -1867885268:  return getSubject();
3780        case -1059891784:  return addTrigger(); 
3781        case -861311717:  return addCondition(); 
3782        case 100358090:  return addInput(); 
3783        case -1005512447:  return addOutput(); 
3784        case -384107967:  return addRelatedAction(); 
3785        case 164632566:  return getTiming();
3786        case -873664438:  return getTiming();
3787        case 1901043637:  return getLocation();
3788        case 767422259:  return addParticipant(); 
3789        case 3575610:  return getType();
3790        case 586678389:  return getGroupingBehaviorElement();
3791        case 168639486:  return getSelectionBehaviorElement();
3792        case -1163906287:  return getRequiredBehaviorElement();
3793        case -1174249033:  return getPrecheckBehaviorElement();
3794        case -922577408:  return getCardinalityBehaviorElement();
3795        case -1139422643:  return getDefinition();
3796        case -1014418093:  return getDefinition();
3797        case 1052666732:  return getTransformElement();
3798        case 572625010:  return addDynamicValue(); 
3799        case -1422950858:  return addAction(); 
3800        default: return super.makeProperty(hash, name);
3801        }
3802
3803      }
3804
3805      @Override
3806      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
3807        switch (hash) {
3808        case -1102667083: /*linkId*/ return new String[] {"string"};
3809        case -980110702: /*prefix*/ return new String[] {"string"};
3810        case 110371416: /*title*/ return new String[] {"string"};
3811        case -1724546052: /*description*/ return new String[] {"markdown"};
3812        case -900391049: /*textEquivalent*/ return new String[] {"markdown"};
3813        case -1165461084: /*priority*/ return new String[] {"code"};
3814        case 3059181: /*code*/ return new String[] {"CodeableConcept"};
3815        case -934964668: /*reason*/ return new String[] {"CodeableConcept"};
3816        case 1587405498: /*documentation*/ return new String[] {"RelatedArtifact"};
3817        case -1240658034: /*goalId*/ return new String[] {"id"};
3818        case -1867885268: /*subject*/ return new String[] {"CodeableConcept", "Reference", "canonical"};
3819        case -1059891784: /*trigger*/ return new String[] {"TriggerDefinition"};
3820        case -861311717: /*condition*/ return new String[] {};
3821        case 100358090: /*input*/ return new String[] {};
3822        case -1005512447: /*output*/ return new String[] {};
3823        case -384107967: /*relatedAction*/ return new String[] {};
3824        case -873664438: /*timing*/ return new String[] {"Age", "Duration", "Range", "Timing"};
3825        case 1901043637: /*location*/ return new String[] {"CodeableReference"};
3826        case 767422259: /*participant*/ return new String[] {};
3827        case 3575610: /*type*/ return new String[] {"CodeableConcept"};
3828        case 586678389: /*groupingBehavior*/ return new String[] {"code"};
3829        case 168639486: /*selectionBehavior*/ return new String[] {"code"};
3830        case -1163906287: /*requiredBehavior*/ return new String[] {"code"};
3831        case -1174249033: /*precheckBehavior*/ return new String[] {"code"};
3832        case -922577408: /*cardinalityBehavior*/ return new String[] {"code"};
3833        case -1014418093: /*definition*/ return new String[] {"canonical", "uri"};
3834        case 1052666732: /*transform*/ return new String[] {"canonical"};
3835        case 572625010: /*dynamicValue*/ return new String[] {};
3836        case -1422950858: /*action*/ return new String[] {"@PlanDefinition.action"};
3837        default: return super.getTypesForProperty(hash, name);
3838        }
3839
3840      }
3841
3842      @Override
3843      public Base addChild(String name) throws FHIRException {
3844        if (name.equals("linkId")) {
3845          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.linkId");
3846        }
3847        else if (name.equals("prefix")) {
3848          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.prefix");
3849        }
3850        else if (name.equals("title")) {
3851          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.title");
3852        }
3853        else if (name.equals("description")) {
3854          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.description");
3855        }
3856        else if (name.equals("textEquivalent")) {
3857          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.textEquivalent");
3858        }
3859        else if (name.equals("priority")) {
3860          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.priority");
3861        }
3862        else if (name.equals("code")) {
3863          this.code = new CodeableConcept();
3864          return this.code;
3865        }
3866        else if (name.equals("reason")) {
3867          return addReason();
3868        }
3869        else if (name.equals("documentation")) {
3870          return addDocumentation();
3871        }
3872        else if (name.equals("goalId")) {
3873          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.goalId");
3874        }
3875        else if (name.equals("subjectCodeableConcept")) {
3876          this.subject = new CodeableConcept();
3877          return this.subject;
3878        }
3879        else if (name.equals("subjectReference")) {
3880          this.subject = new Reference();
3881          return this.subject;
3882        }
3883        else if (name.equals("subjectCanonical")) {
3884          this.subject = new CanonicalType();
3885          return this.subject;
3886        }
3887        else if (name.equals("trigger")) {
3888          return addTrigger();
3889        }
3890        else if (name.equals("condition")) {
3891          return addCondition();
3892        }
3893        else if (name.equals("input")) {
3894          return addInput();
3895        }
3896        else if (name.equals("output")) {
3897          return addOutput();
3898        }
3899        else if (name.equals("relatedAction")) {
3900          return addRelatedAction();
3901        }
3902        else if (name.equals("timingAge")) {
3903          this.timing = new Age();
3904          return this.timing;
3905        }
3906        else if (name.equals("timingDuration")) {
3907          this.timing = new Duration();
3908          return this.timing;
3909        }
3910        else if (name.equals("timingRange")) {
3911          this.timing = new Range();
3912          return this.timing;
3913        }
3914        else if (name.equals("timingTiming")) {
3915          this.timing = new Timing();
3916          return this.timing;
3917        }
3918        else if (name.equals("location")) {
3919          this.location = new CodeableReference();
3920          return this.location;
3921        }
3922        else if (name.equals("participant")) {
3923          return addParticipant();
3924        }
3925        else if (name.equals("type")) {
3926          this.type = new CodeableConcept();
3927          return this.type;
3928        }
3929        else if (name.equals("groupingBehavior")) {
3930          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.groupingBehavior");
3931        }
3932        else if (name.equals("selectionBehavior")) {
3933          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.selectionBehavior");
3934        }
3935        else if (name.equals("requiredBehavior")) {
3936          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.requiredBehavior");
3937        }
3938        else if (name.equals("precheckBehavior")) {
3939          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.precheckBehavior");
3940        }
3941        else if (name.equals("cardinalityBehavior")) {
3942          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.cardinalityBehavior");
3943        }
3944        else if (name.equals("definitionCanonical")) {
3945          this.definition = new CanonicalType();
3946          return this.definition;
3947        }
3948        else if (name.equals("definitionUri")) {
3949          this.definition = new UriType();
3950          return this.definition;
3951        }
3952        else if (name.equals("transform")) {
3953          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.transform");
3954        }
3955        else if (name.equals("dynamicValue")) {
3956          return addDynamicValue();
3957        }
3958        else if (name.equals("action")) {
3959          return addAction();
3960        }
3961        else
3962          return super.addChild(name);
3963      }
3964
3965      public PlanDefinitionActionComponent copy() {
3966        PlanDefinitionActionComponent dst = new PlanDefinitionActionComponent();
3967        copyValues(dst);
3968        return dst;
3969      }
3970
3971      public void copyValues(PlanDefinitionActionComponent dst) {
3972        super.copyValues(dst);
3973        dst.linkId = linkId == null ? null : linkId.copy();
3974        dst.prefix = prefix == null ? null : prefix.copy();
3975        dst.title = title == null ? null : title.copy();
3976        dst.description = description == null ? null : description.copy();
3977        dst.textEquivalent = textEquivalent == null ? null : textEquivalent.copy();
3978        dst.priority = priority == null ? null : priority.copy();
3979        dst.code = code == null ? null : code.copy();
3980        if (reason != null) {
3981          dst.reason = new ArrayList<CodeableConcept>();
3982          for (CodeableConcept i : reason)
3983            dst.reason.add(i.copy());
3984        };
3985        if (documentation != null) {
3986          dst.documentation = new ArrayList<RelatedArtifact>();
3987          for (RelatedArtifact i : documentation)
3988            dst.documentation.add(i.copy());
3989        };
3990        if (goalId != null) {
3991          dst.goalId = new ArrayList<IdType>();
3992          for (IdType i : goalId)
3993            dst.goalId.add(i.copy());
3994        };
3995        dst.subject = subject == null ? null : subject.copy();
3996        if (trigger != null) {
3997          dst.trigger = new ArrayList<TriggerDefinition>();
3998          for (TriggerDefinition i : trigger)
3999            dst.trigger.add(i.copy());
4000        };
4001        if (condition != null) {
4002          dst.condition = new ArrayList<PlanDefinitionActionConditionComponent>();
4003          for (PlanDefinitionActionConditionComponent i : condition)
4004            dst.condition.add(i.copy());
4005        };
4006        if (input != null) {
4007          dst.input = new ArrayList<PlanDefinitionActionInputComponent>();
4008          for (PlanDefinitionActionInputComponent i : input)
4009            dst.input.add(i.copy());
4010        };
4011        if (output != null) {
4012          dst.output = new ArrayList<PlanDefinitionActionOutputComponent>();
4013          for (PlanDefinitionActionOutputComponent i : output)
4014            dst.output.add(i.copy());
4015        };
4016        if (relatedAction != null) {
4017          dst.relatedAction = new ArrayList<PlanDefinitionActionRelatedActionComponent>();
4018          for (PlanDefinitionActionRelatedActionComponent i : relatedAction)
4019            dst.relatedAction.add(i.copy());
4020        };
4021        dst.timing = timing == null ? null : timing.copy();
4022        dst.location = location == null ? null : location.copy();
4023        if (participant != null) {
4024          dst.participant = new ArrayList<PlanDefinitionActionParticipantComponent>();
4025          for (PlanDefinitionActionParticipantComponent i : participant)
4026            dst.participant.add(i.copy());
4027        };
4028        dst.type = type == null ? null : type.copy();
4029        dst.groupingBehavior = groupingBehavior == null ? null : groupingBehavior.copy();
4030        dst.selectionBehavior = selectionBehavior == null ? null : selectionBehavior.copy();
4031        dst.requiredBehavior = requiredBehavior == null ? null : requiredBehavior.copy();
4032        dst.precheckBehavior = precheckBehavior == null ? null : precheckBehavior.copy();
4033        dst.cardinalityBehavior = cardinalityBehavior == null ? null : cardinalityBehavior.copy();
4034        dst.definition = definition == null ? null : definition.copy();
4035        dst.transform = transform == null ? null : transform.copy();
4036        if (dynamicValue != null) {
4037          dst.dynamicValue = new ArrayList<PlanDefinitionActionDynamicValueComponent>();
4038          for (PlanDefinitionActionDynamicValueComponent i : dynamicValue)
4039            dst.dynamicValue.add(i.copy());
4040        };
4041        if (action != null) {
4042          dst.action = new ArrayList<PlanDefinitionActionComponent>();
4043          for (PlanDefinitionActionComponent i : action)
4044            dst.action.add(i.copy());
4045        };
4046      }
4047
4048      @Override
4049      public boolean equalsDeep(Base other_) {
4050        if (!super.equalsDeep(other_))
4051          return false;
4052        if (!(other_ instanceof PlanDefinitionActionComponent))
4053          return false;
4054        PlanDefinitionActionComponent o = (PlanDefinitionActionComponent) other_;
4055        return compareDeep(linkId, o.linkId, true) && compareDeep(prefix, o.prefix, true) && compareDeep(title, o.title, true)
4056           && compareDeep(description, o.description, true) && compareDeep(textEquivalent, o.textEquivalent, true)
4057           && compareDeep(priority, o.priority, true) && compareDeep(code, o.code, true) && compareDeep(reason, o.reason, true)
4058           && compareDeep(documentation, o.documentation, true) && compareDeep(goalId, o.goalId, true) && compareDeep(subject, o.subject, true)
4059           && compareDeep(trigger, o.trigger, true) && compareDeep(condition, o.condition, true) && compareDeep(input, o.input, true)
4060           && compareDeep(output, o.output, true) && compareDeep(relatedAction, o.relatedAction, true) && compareDeep(timing, o.timing, true)
4061           && compareDeep(location, o.location, true) && compareDeep(participant, o.participant, true) && compareDeep(type, o.type, true)
4062           && compareDeep(groupingBehavior, o.groupingBehavior, true) && compareDeep(selectionBehavior, o.selectionBehavior, true)
4063           && compareDeep(requiredBehavior, o.requiredBehavior, true) && compareDeep(precheckBehavior, o.precheckBehavior, true)
4064           && compareDeep(cardinalityBehavior, o.cardinalityBehavior, true) && compareDeep(definition, o.definition, true)
4065           && compareDeep(transform, o.transform, true) && compareDeep(dynamicValue, o.dynamicValue, true)
4066           && compareDeep(action, o.action, true);
4067      }
4068
4069      @Override
4070      public boolean equalsShallow(Base other_) {
4071        if (!super.equalsShallow(other_))
4072          return false;
4073        if (!(other_ instanceof PlanDefinitionActionComponent))
4074          return false;
4075        PlanDefinitionActionComponent o = (PlanDefinitionActionComponent) other_;
4076        return compareValues(linkId, o.linkId, true) && compareValues(prefix, o.prefix, true) && compareValues(title, o.title, true)
4077           && compareValues(description, o.description, true) && compareValues(textEquivalent, o.textEquivalent, true)
4078           && compareValues(priority, o.priority, true) && compareValues(goalId, o.goalId, true) && compareValues(groupingBehavior, o.groupingBehavior, true)
4079           && compareValues(selectionBehavior, o.selectionBehavior, true) && compareValues(requiredBehavior, o.requiredBehavior, true)
4080           && compareValues(precheckBehavior, o.precheckBehavior, true) && compareValues(cardinalityBehavior, o.cardinalityBehavior, true)
4081           && compareValues(transform, o.transform, true);
4082      }
4083
4084      public boolean isEmpty() {
4085        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(linkId, prefix, title, description
4086          , textEquivalent, priority, code, reason, documentation, goalId, subject, trigger
4087          , condition, input, output, relatedAction, timing, location, participant, type
4088          , groupingBehavior, selectionBehavior, requiredBehavior, precheckBehavior, cardinalityBehavior
4089          , definition, transform, dynamicValue, action);
4090      }
4091
4092  public String fhirType() {
4093    return "PlanDefinition.action";
4094
4095  }
4096
4097  }
4098
4099    @Block()
4100    public static class PlanDefinitionActionConditionComponent extends BackboneElement implements IBaseBackboneElement {
4101        /**
4102         * The kind of condition.
4103         */
4104        @Child(name = "kind", type = {CodeType.class}, order=1, min=1, max=1, modifier=false, summary=false)
4105        @Description(shortDefinition="applicability | start | stop", formalDefinition="The kind of condition." )
4106        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-condition-kind")
4107        protected Enumeration<ActionConditionKind> kind;
4108
4109        /**
4110         * An expression that returns true or false, indicating whether the condition is satisfied.
4111         */
4112        @Child(name = "expression", type = {Expression.class}, order=2, min=0, max=1, modifier=false, summary=false)
4113        @Description(shortDefinition="Boolean-valued expression", formalDefinition="An expression that returns true or false, indicating whether the condition is satisfied." )
4114        protected Expression expression;
4115
4116        private static final long serialVersionUID = -455150438L;
4117
4118    /**
4119     * Constructor
4120     */
4121      public PlanDefinitionActionConditionComponent() {
4122        super();
4123      }
4124
4125    /**
4126     * Constructor
4127     */
4128      public PlanDefinitionActionConditionComponent(ActionConditionKind kind) {
4129        super();
4130        this.setKind(kind);
4131      }
4132
4133        /**
4134         * @return {@link #kind} (The kind of condition.). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
4135         */
4136        public Enumeration<ActionConditionKind> getKindElement() { 
4137          if (this.kind == null)
4138            if (Configuration.errorOnAutoCreate())
4139              throw new Error("Attempt to auto-create PlanDefinitionActionConditionComponent.kind");
4140            else if (Configuration.doAutoCreate())
4141              this.kind = new Enumeration<ActionConditionKind>(new ActionConditionKindEnumFactory()); // bb
4142          return this.kind;
4143        }
4144
4145        public boolean hasKindElement() { 
4146          return this.kind != null && !this.kind.isEmpty();
4147        }
4148
4149        public boolean hasKind() { 
4150          return this.kind != null && !this.kind.isEmpty();
4151        }
4152
4153        /**
4154         * @param value {@link #kind} (The kind of condition.). This is the underlying object with id, value and extensions. The accessor "getKind" gives direct access to the value
4155         */
4156        public PlanDefinitionActionConditionComponent setKindElement(Enumeration<ActionConditionKind> value) { 
4157          this.kind = value;
4158          return this;
4159        }
4160
4161        /**
4162         * @return The kind of condition.
4163         */
4164        public ActionConditionKind getKind() { 
4165          return this.kind == null ? null : this.kind.getValue();
4166        }
4167
4168        /**
4169         * @param value The kind of condition.
4170         */
4171        public PlanDefinitionActionConditionComponent setKind(ActionConditionKind value) { 
4172            if (this.kind == null)
4173              this.kind = new Enumeration<ActionConditionKind>(new ActionConditionKindEnumFactory());
4174            this.kind.setValue(value);
4175          return this;
4176        }
4177
4178        /**
4179         * @return {@link #expression} (An expression that returns true or false, indicating whether the condition is satisfied.)
4180         */
4181        public Expression getExpression() { 
4182          if (this.expression == null)
4183            if (Configuration.errorOnAutoCreate())
4184              throw new Error("Attempt to auto-create PlanDefinitionActionConditionComponent.expression");
4185            else if (Configuration.doAutoCreate())
4186              this.expression = new Expression(); // cc
4187          return this.expression;
4188        }
4189
4190        public boolean hasExpression() { 
4191          return this.expression != null && !this.expression.isEmpty();
4192        }
4193
4194        /**
4195         * @param value {@link #expression} (An expression that returns true or false, indicating whether the condition is satisfied.)
4196         */
4197        public PlanDefinitionActionConditionComponent setExpression(Expression value) { 
4198          this.expression = value;
4199          return this;
4200        }
4201
4202        protected void listChildren(List<Property> children) {
4203          super.listChildren(children);
4204          children.add(new Property("kind", "code", "The kind of condition.", 0, 1, kind));
4205          children.add(new Property("expression", "Expression", "An expression that returns true or false, indicating whether the condition is satisfied.", 0, 1, expression));
4206        }
4207
4208        @Override
4209        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4210          switch (_hash) {
4211          case 3292052: /*kind*/  return new Property("kind", "code", "The kind of condition.", 0, 1, kind);
4212          case -1795452264: /*expression*/  return new Property("expression", "Expression", "An expression that returns true or false, indicating whether the condition is satisfied.", 0, 1, expression);
4213          default: return super.getNamedProperty(_hash, _name, _checkValid);
4214          }
4215
4216        }
4217
4218      @Override
4219      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4220        switch (hash) {
4221        case 3292052: /*kind*/ return this.kind == null ? new Base[0] : new Base[] {this.kind}; // Enumeration<ActionConditionKind>
4222        case -1795452264: /*expression*/ return this.expression == null ? new Base[0] : new Base[] {this.expression}; // Expression
4223        default: return super.getProperty(hash, name, checkValid);
4224        }
4225
4226      }
4227
4228      @Override
4229      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4230        switch (hash) {
4231        case 3292052: // kind
4232          value = new ActionConditionKindEnumFactory().fromType(TypeConvertor.castToCode(value));
4233          this.kind = (Enumeration) value; // Enumeration<ActionConditionKind>
4234          return value;
4235        case -1795452264: // expression
4236          this.expression = TypeConvertor.castToExpression(value); // Expression
4237          return value;
4238        default: return super.setProperty(hash, name, value);
4239        }
4240
4241      }
4242
4243      @Override
4244      public Base setProperty(String name, Base value) throws FHIRException {
4245        if (name.equals("kind")) {
4246          value = new ActionConditionKindEnumFactory().fromType(TypeConvertor.castToCode(value));
4247          this.kind = (Enumeration) value; // Enumeration<ActionConditionKind>
4248        } else if (name.equals("expression")) {
4249          this.expression = TypeConvertor.castToExpression(value); // Expression
4250        } else
4251          return super.setProperty(name, value);
4252        return value;
4253      }
4254
4255  @Override
4256  public void removeChild(String name, Base value) throws FHIRException {
4257        if (name.equals("kind")) {
4258          value = new ActionConditionKindEnumFactory().fromType(TypeConvertor.castToCode(value));
4259          this.kind = (Enumeration) value; // Enumeration<ActionConditionKind>
4260        } else if (name.equals("expression")) {
4261          this.expression = null;
4262        } else
4263          super.removeChild(name, value);
4264        
4265      }
4266
4267      @Override
4268      public Base makeProperty(int hash, String name) throws FHIRException {
4269        switch (hash) {
4270        case 3292052:  return getKindElement();
4271        case -1795452264:  return getExpression();
4272        default: return super.makeProperty(hash, name);
4273        }
4274
4275      }
4276
4277      @Override
4278      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4279        switch (hash) {
4280        case 3292052: /*kind*/ return new String[] {"code"};
4281        case -1795452264: /*expression*/ return new String[] {"Expression"};
4282        default: return super.getTypesForProperty(hash, name);
4283        }
4284
4285      }
4286
4287      @Override
4288      public Base addChild(String name) throws FHIRException {
4289        if (name.equals("kind")) {
4290          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.condition.kind");
4291        }
4292        else if (name.equals("expression")) {
4293          this.expression = new Expression();
4294          return this.expression;
4295        }
4296        else
4297          return super.addChild(name);
4298      }
4299
4300      public PlanDefinitionActionConditionComponent copy() {
4301        PlanDefinitionActionConditionComponent dst = new PlanDefinitionActionConditionComponent();
4302        copyValues(dst);
4303        return dst;
4304      }
4305
4306      public void copyValues(PlanDefinitionActionConditionComponent dst) {
4307        super.copyValues(dst);
4308        dst.kind = kind == null ? null : kind.copy();
4309        dst.expression = expression == null ? null : expression.copy();
4310      }
4311
4312      @Override
4313      public boolean equalsDeep(Base other_) {
4314        if (!super.equalsDeep(other_))
4315          return false;
4316        if (!(other_ instanceof PlanDefinitionActionConditionComponent))
4317          return false;
4318        PlanDefinitionActionConditionComponent o = (PlanDefinitionActionConditionComponent) other_;
4319        return compareDeep(kind, o.kind, true) && compareDeep(expression, o.expression, true);
4320      }
4321
4322      @Override
4323      public boolean equalsShallow(Base other_) {
4324        if (!super.equalsShallow(other_))
4325          return false;
4326        if (!(other_ instanceof PlanDefinitionActionConditionComponent))
4327          return false;
4328        PlanDefinitionActionConditionComponent o = (PlanDefinitionActionConditionComponent) other_;
4329        return compareValues(kind, o.kind, true);
4330      }
4331
4332      public boolean isEmpty() {
4333        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(kind, expression);
4334      }
4335
4336  public String fhirType() {
4337    return "PlanDefinition.action.condition";
4338
4339  }
4340
4341  }
4342
4343    @Block()
4344    public static class PlanDefinitionActionInputComponent extends BackboneElement implements IBaseBackboneElement {
4345        /**
4346         * A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4347         */
4348        @Child(name = "title", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
4349        @Description(shortDefinition="User-visible title", formalDefinition="A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers." )
4350        protected StringType title;
4351
4352        /**
4353         * Defines the data that is to be provided as input to the action.
4354         */
4355        @Child(name = "requirement", type = {DataRequirement.class}, order=2, min=0, max=1, modifier=false, summary=false)
4356        @Description(shortDefinition="What data is provided", formalDefinition="Defines the data that is to be provided as input to the action." )
4357        protected DataRequirement requirement;
4358
4359        /**
4360         * Points to an existing input or output element that provides data to this input.
4361         */
4362        @Child(name = "relatedData", type = {IdType.class}, order=3, min=0, max=1, modifier=false, summary=false)
4363        @Description(shortDefinition="What data is provided", formalDefinition="Points to an existing input or output element that provides data to this input." )
4364        protected IdType relatedData;
4365
4366        private static final long serialVersionUID = -1064046709L;
4367
4368    /**
4369     * Constructor
4370     */
4371      public PlanDefinitionActionInputComponent() {
4372        super();
4373      }
4374
4375        /**
4376         * @return {@link #title} (A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
4377         */
4378        public StringType getTitleElement() { 
4379          if (this.title == null)
4380            if (Configuration.errorOnAutoCreate())
4381              throw new Error("Attempt to auto-create PlanDefinitionActionInputComponent.title");
4382            else if (Configuration.doAutoCreate())
4383              this.title = new StringType(); // bb
4384          return this.title;
4385        }
4386
4387        public boolean hasTitleElement() { 
4388          return this.title != null && !this.title.isEmpty();
4389        }
4390
4391        public boolean hasTitle() { 
4392          return this.title != null && !this.title.isEmpty();
4393        }
4394
4395        /**
4396         * @param value {@link #title} (A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
4397         */
4398        public PlanDefinitionActionInputComponent setTitleElement(StringType value) { 
4399          this.title = value;
4400          return this;
4401        }
4402
4403        /**
4404         * @return A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4405         */
4406        public String getTitle() { 
4407          return this.title == null ? null : this.title.getValue();
4408        }
4409
4410        /**
4411         * @param value A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4412         */
4413        public PlanDefinitionActionInputComponent setTitle(String value) { 
4414          if (Utilities.noString(value))
4415            this.title = null;
4416          else {
4417            if (this.title == null)
4418              this.title = new StringType();
4419            this.title.setValue(value);
4420          }
4421          return this;
4422        }
4423
4424        /**
4425         * @return {@link #requirement} (Defines the data that is to be provided as input to the action.)
4426         */
4427        public DataRequirement getRequirement() { 
4428          if (this.requirement == null)
4429            if (Configuration.errorOnAutoCreate())
4430              throw new Error("Attempt to auto-create PlanDefinitionActionInputComponent.requirement");
4431            else if (Configuration.doAutoCreate())
4432              this.requirement = new DataRequirement(); // cc
4433          return this.requirement;
4434        }
4435
4436        public boolean hasRequirement() { 
4437          return this.requirement != null && !this.requirement.isEmpty();
4438        }
4439
4440        /**
4441         * @param value {@link #requirement} (Defines the data that is to be provided as input to the action.)
4442         */
4443        public PlanDefinitionActionInputComponent setRequirement(DataRequirement value) { 
4444          this.requirement = value;
4445          return this;
4446        }
4447
4448        /**
4449         * @return {@link #relatedData} (Points to an existing input or output element that provides data to this input.). This is the underlying object with id, value and extensions. The accessor "getRelatedData" gives direct access to the value
4450         */
4451        public IdType getRelatedDataElement() { 
4452          if (this.relatedData == null)
4453            if (Configuration.errorOnAutoCreate())
4454              throw new Error("Attempt to auto-create PlanDefinitionActionInputComponent.relatedData");
4455            else if (Configuration.doAutoCreate())
4456              this.relatedData = new IdType(); // bb
4457          return this.relatedData;
4458        }
4459
4460        public boolean hasRelatedDataElement() { 
4461          return this.relatedData != null && !this.relatedData.isEmpty();
4462        }
4463
4464        public boolean hasRelatedData() { 
4465          return this.relatedData != null && !this.relatedData.isEmpty();
4466        }
4467
4468        /**
4469         * @param value {@link #relatedData} (Points to an existing input or output element that provides data to this input.). This is the underlying object with id, value and extensions. The accessor "getRelatedData" gives direct access to the value
4470         */
4471        public PlanDefinitionActionInputComponent setRelatedDataElement(IdType value) { 
4472          this.relatedData = value;
4473          return this;
4474        }
4475
4476        /**
4477         * @return Points to an existing input or output element that provides data to this input.
4478         */
4479        public String getRelatedData() { 
4480          return this.relatedData == null ? null : this.relatedData.getValue();
4481        }
4482
4483        /**
4484         * @param value Points to an existing input or output element that provides data to this input.
4485         */
4486        public PlanDefinitionActionInputComponent setRelatedData(String value) { 
4487          if (Utilities.noString(value))
4488            this.relatedData = null;
4489          else {
4490            if (this.relatedData == null)
4491              this.relatedData = new IdType();
4492            this.relatedData.setValue(value);
4493          }
4494          return this;
4495        }
4496
4497        protected void listChildren(List<Property> children) {
4498          super.listChildren(children);
4499          children.add(new Property("title", "string", "A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.", 0, 1, title));
4500          children.add(new Property("requirement", "DataRequirement", "Defines the data that is to be provided as input to the action.", 0, 1, requirement));
4501          children.add(new Property("relatedData", "id", "Points to an existing input or output element that provides data to this input.", 0, 1, relatedData));
4502        }
4503
4504        @Override
4505        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4506          switch (_hash) {
4507          case 110371416: /*title*/  return new Property("title", "string", "A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.", 0, 1, title);
4508          case 363387971: /*requirement*/  return new Property("requirement", "DataRequirement", "Defines the data that is to be provided as input to the action.", 0, 1, requirement);
4509          case 1112535669: /*relatedData*/  return new Property("relatedData", "id", "Points to an existing input or output element that provides data to this input.", 0, 1, relatedData);
4510          default: return super.getNamedProperty(_hash, _name, _checkValid);
4511          }
4512
4513        }
4514
4515      @Override
4516      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4517        switch (hash) {
4518        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
4519        case 363387971: /*requirement*/ return this.requirement == null ? new Base[0] : new Base[] {this.requirement}; // DataRequirement
4520        case 1112535669: /*relatedData*/ return this.relatedData == null ? new Base[0] : new Base[] {this.relatedData}; // IdType
4521        default: return super.getProperty(hash, name, checkValid);
4522        }
4523
4524      }
4525
4526      @Override
4527      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4528        switch (hash) {
4529        case 110371416: // title
4530          this.title = TypeConvertor.castToString(value); // StringType
4531          return value;
4532        case 363387971: // requirement
4533          this.requirement = TypeConvertor.castToDataRequirement(value); // DataRequirement
4534          return value;
4535        case 1112535669: // relatedData
4536          this.relatedData = TypeConvertor.castToId(value); // IdType
4537          return value;
4538        default: return super.setProperty(hash, name, value);
4539        }
4540
4541      }
4542
4543      @Override
4544      public Base setProperty(String name, Base value) throws FHIRException {
4545        if (name.equals("title")) {
4546          this.title = TypeConvertor.castToString(value); // StringType
4547        } else if (name.equals("requirement")) {
4548          this.requirement = TypeConvertor.castToDataRequirement(value); // DataRequirement
4549        } else if (name.equals("relatedData")) {
4550          this.relatedData = TypeConvertor.castToId(value); // IdType
4551        } else
4552          return super.setProperty(name, value);
4553        return value;
4554      }
4555
4556  @Override
4557  public void removeChild(String name, Base value) throws FHIRException {
4558        if (name.equals("title")) {
4559          this.title = null;
4560        } else if (name.equals("requirement")) {
4561          this.requirement = null;
4562        } else if (name.equals("relatedData")) {
4563          this.relatedData = null;
4564        } else
4565          super.removeChild(name, value);
4566        
4567      }
4568
4569      @Override
4570      public Base makeProperty(int hash, String name) throws FHIRException {
4571        switch (hash) {
4572        case 110371416:  return getTitleElement();
4573        case 363387971:  return getRequirement();
4574        case 1112535669:  return getRelatedDataElement();
4575        default: return super.makeProperty(hash, name);
4576        }
4577
4578      }
4579
4580      @Override
4581      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4582        switch (hash) {
4583        case 110371416: /*title*/ return new String[] {"string"};
4584        case 363387971: /*requirement*/ return new String[] {"DataRequirement"};
4585        case 1112535669: /*relatedData*/ return new String[] {"id"};
4586        default: return super.getTypesForProperty(hash, name);
4587        }
4588
4589      }
4590
4591      @Override
4592      public Base addChild(String name) throws FHIRException {
4593        if (name.equals("title")) {
4594          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.input.title");
4595        }
4596        else if (name.equals("requirement")) {
4597          this.requirement = new DataRequirement();
4598          return this.requirement;
4599        }
4600        else if (name.equals("relatedData")) {
4601          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.input.relatedData");
4602        }
4603        else
4604          return super.addChild(name);
4605      }
4606
4607      public PlanDefinitionActionInputComponent copy() {
4608        PlanDefinitionActionInputComponent dst = new PlanDefinitionActionInputComponent();
4609        copyValues(dst);
4610        return dst;
4611      }
4612
4613      public void copyValues(PlanDefinitionActionInputComponent dst) {
4614        super.copyValues(dst);
4615        dst.title = title == null ? null : title.copy();
4616        dst.requirement = requirement == null ? null : requirement.copy();
4617        dst.relatedData = relatedData == null ? null : relatedData.copy();
4618      }
4619
4620      @Override
4621      public boolean equalsDeep(Base other_) {
4622        if (!super.equalsDeep(other_))
4623          return false;
4624        if (!(other_ instanceof PlanDefinitionActionInputComponent))
4625          return false;
4626        PlanDefinitionActionInputComponent o = (PlanDefinitionActionInputComponent) other_;
4627        return compareDeep(title, o.title, true) && compareDeep(requirement, o.requirement, true) && compareDeep(relatedData, o.relatedData, true)
4628          ;
4629      }
4630
4631      @Override
4632      public boolean equalsShallow(Base other_) {
4633        if (!super.equalsShallow(other_))
4634          return false;
4635        if (!(other_ instanceof PlanDefinitionActionInputComponent))
4636          return false;
4637        PlanDefinitionActionInputComponent o = (PlanDefinitionActionInputComponent) other_;
4638        return compareValues(title, o.title, true) && compareValues(relatedData, o.relatedData, true);
4639      }
4640
4641      public boolean isEmpty() {
4642        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(title, requirement, relatedData
4643          );
4644      }
4645
4646  public String fhirType() {
4647    return "PlanDefinition.action.input";
4648
4649  }
4650
4651  }
4652
4653    @Block()
4654    public static class PlanDefinitionActionOutputComponent extends BackboneElement implements IBaseBackboneElement {
4655        /**
4656         * A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4657         */
4658        @Child(name = "title", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
4659        @Description(shortDefinition="User-visible title", formalDefinition="A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers." )
4660        protected StringType title;
4661
4662        /**
4663         * Defines the data that results as output from the action.
4664         */
4665        @Child(name = "requirement", type = {DataRequirement.class}, order=2, min=0, max=1, modifier=false, summary=false)
4666        @Description(shortDefinition="What data is provided", formalDefinition="Defines the data that results as output from the action." )
4667        protected DataRequirement requirement;
4668
4669        /**
4670         * Points to an existing input or output element that is results as output from the action.
4671         */
4672        @Child(name = "relatedData", type = {StringType.class}, order=3, min=0, max=1, modifier=false, summary=false)
4673        @Description(shortDefinition="What data is provided", formalDefinition="Points to an existing input or output element that is results as output from the action." )
4674        protected StringType relatedData;
4675
4676        private static final long serialVersionUID = 1822414421L;
4677
4678    /**
4679     * Constructor
4680     */
4681      public PlanDefinitionActionOutputComponent() {
4682        super();
4683      }
4684
4685        /**
4686         * @return {@link #title} (A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
4687         */
4688        public StringType getTitleElement() { 
4689          if (this.title == null)
4690            if (Configuration.errorOnAutoCreate())
4691              throw new Error("Attempt to auto-create PlanDefinitionActionOutputComponent.title");
4692            else if (Configuration.doAutoCreate())
4693              this.title = new StringType(); // bb
4694          return this.title;
4695        }
4696
4697        public boolean hasTitleElement() { 
4698          return this.title != null && !this.title.isEmpty();
4699        }
4700
4701        public boolean hasTitle() { 
4702          return this.title != null && !this.title.isEmpty();
4703        }
4704
4705        /**
4706         * @param value {@link #title} (A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
4707         */
4708        public PlanDefinitionActionOutputComponent setTitleElement(StringType value) { 
4709          this.title = value;
4710          return this;
4711        }
4712
4713        /**
4714         * @return A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4715         */
4716        public String getTitle() { 
4717          return this.title == null ? null : this.title.getValue();
4718        }
4719
4720        /**
4721         * @param value A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.
4722         */
4723        public PlanDefinitionActionOutputComponent setTitle(String value) { 
4724          if (Utilities.noString(value))
4725            this.title = null;
4726          else {
4727            if (this.title == null)
4728              this.title = new StringType();
4729            this.title.setValue(value);
4730          }
4731          return this;
4732        }
4733
4734        /**
4735         * @return {@link #requirement} (Defines the data that results as output from the action.)
4736         */
4737        public DataRequirement getRequirement() { 
4738          if (this.requirement == null)
4739            if (Configuration.errorOnAutoCreate())
4740              throw new Error("Attempt to auto-create PlanDefinitionActionOutputComponent.requirement");
4741            else if (Configuration.doAutoCreate())
4742              this.requirement = new DataRequirement(); // cc
4743          return this.requirement;
4744        }
4745
4746        public boolean hasRequirement() { 
4747          return this.requirement != null && !this.requirement.isEmpty();
4748        }
4749
4750        /**
4751         * @param value {@link #requirement} (Defines the data that results as output from the action.)
4752         */
4753        public PlanDefinitionActionOutputComponent setRequirement(DataRequirement value) { 
4754          this.requirement = value;
4755          return this;
4756        }
4757
4758        /**
4759         * @return {@link #relatedData} (Points to an existing input or output element that is results as output from the action.). This is the underlying object with id, value and extensions. The accessor "getRelatedData" gives direct access to the value
4760         */
4761        public StringType getRelatedDataElement() { 
4762          if (this.relatedData == null)
4763            if (Configuration.errorOnAutoCreate())
4764              throw new Error("Attempt to auto-create PlanDefinitionActionOutputComponent.relatedData");
4765            else if (Configuration.doAutoCreate())
4766              this.relatedData = new StringType(); // bb
4767          return this.relatedData;
4768        }
4769
4770        public boolean hasRelatedDataElement() { 
4771          return this.relatedData != null && !this.relatedData.isEmpty();
4772        }
4773
4774        public boolean hasRelatedData() { 
4775          return this.relatedData != null && !this.relatedData.isEmpty();
4776        }
4777
4778        /**
4779         * @param value {@link #relatedData} (Points to an existing input or output element that is results as output from the action.). This is the underlying object with id, value and extensions. The accessor "getRelatedData" gives direct access to the value
4780         */
4781        public PlanDefinitionActionOutputComponent setRelatedDataElement(StringType value) { 
4782          this.relatedData = value;
4783          return this;
4784        }
4785
4786        /**
4787         * @return Points to an existing input or output element that is results as output from the action.
4788         */
4789        public String getRelatedData() { 
4790          return this.relatedData == null ? null : this.relatedData.getValue();
4791        }
4792
4793        /**
4794         * @param value Points to an existing input or output element that is results as output from the action.
4795         */
4796        public PlanDefinitionActionOutputComponent setRelatedData(String value) { 
4797          if (Utilities.noString(value))
4798            this.relatedData = null;
4799          else {
4800            if (this.relatedData == null)
4801              this.relatedData = new StringType();
4802            this.relatedData.setValue(value);
4803          }
4804          return this;
4805        }
4806
4807        protected void listChildren(List<Property> children) {
4808          super.listChildren(children);
4809          children.add(new Property("title", "string", "A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.", 0, 1, title));
4810          children.add(new Property("requirement", "DataRequirement", "Defines the data that results as output from the action.", 0, 1, requirement));
4811          children.add(new Property("relatedData", "string", "Points to an existing input or output element that is results as output from the action.", 0, 1, relatedData));
4812        }
4813
4814        @Override
4815        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
4816          switch (_hash) {
4817          case 110371416: /*title*/  return new Property("title", "string", "A human-readable label for the data requirement used to label data flows in BPMN or similar diagrams. Also provides a human readable label when rendering the data requirement that conveys its purpose to human readers.", 0, 1, title);
4818          case 363387971: /*requirement*/  return new Property("requirement", "DataRequirement", "Defines the data that results as output from the action.", 0, 1, requirement);
4819          case 1112535669: /*relatedData*/  return new Property("relatedData", "string", "Points to an existing input or output element that is results as output from the action.", 0, 1, relatedData);
4820          default: return super.getNamedProperty(_hash, _name, _checkValid);
4821          }
4822
4823        }
4824
4825      @Override
4826      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
4827        switch (hash) {
4828        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
4829        case 363387971: /*requirement*/ return this.requirement == null ? new Base[0] : new Base[] {this.requirement}; // DataRequirement
4830        case 1112535669: /*relatedData*/ return this.relatedData == null ? new Base[0] : new Base[] {this.relatedData}; // StringType
4831        default: return super.getProperty(hash, name, checkValid);
4832        }
4833
4834      }
4835
4836      @Override
4837      public Base setProperty(int hash, String name, Base value) throws FHIRException {
4838        switch (hash) {
4839        case 110371416: // title
4840          this.title = TypeConvertor.castToString(value); // StringType
4841          return value;
4842        case 363387971: // requirement
4843          this.requirement = TypeConvertor.castToDataRequirement(value); // DataRequirement
4844          return value;
4845        case 1112535669: // relatedData
4846          this.relatedData = TypeConvertor.castToString(value); // StringType
4847          return value;
4848        default: return super.setProperty(hash, name, value);
4849        }
4850
4851      }
4852
4853      @Override
4854      public Base setProperty(String name, Base value) throws FHIRException {
4855        if (name.equals("title")) {
4856          this.title = TypeConvertor.castToString(value); // StringType
4857        } else if (name.equals("requirement")) {
4858          this.requirement = TypeConvertor.castToDataRequirement(value); // DataRequirement
4859        } else if (name.equals("relatedData")) {
4860          this.relatedData = TypeConvertor.castToString(value); // StringType
4861        } else
4862          return super.setProperty(name, value);
4863        return value;
4864      }
4865
4866  @Override
4867  public void removeChild(String name, Base value) throws FHIRException {
4868        if (name.equals("title")) {
4869          this.title = null;
4870        } else if (name.equals("requirement")) {
4871          this.requirement = null;
4872        } else if (name.equals("relatedData")) {
4873          this.relatedData = null;
4874        } else
4875          super.removeChild(name, value);
4876        
4877      }
4878
4879      @Override
4880      public Base makeProperty(int hash, String name) throws FHIRException {
4881        switch (hash) {
4882        case 110371416:  return getTitleElement();
4883        case 363387971:  return getRequirement();
4884        case 1112535669:  return getRelatedDataElement();
4885        default: return super.makeProperty(hash, name);
4886        }
4887
4888      }
4889
4890      @Override
4891      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
4892        switch (hash) {
4893        case 110371416: /*title*/ return new String[] {"string"};
4894        case 363387971: /*requirement*/ return new String[] {"DataRequirement"};
4895        case 1112535669: /*relatedData*/ return new String[] {"string"};
4896        default: return super.getTypesForProperty(hash, name);
4897        }
4898
4899      }
4900
4901      @Override
4902      public Base addChild(String name) throws FHIRException {
4903        if (name.equals("title")) {
4904          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.output.title");
4905        }
4906        else if (name.equals("requirement")) {
4907          this.requirement = new DataRequirement();
4908          return this.requirement;
4909        }
4910        else if (name.equals("relatedData")) {
4911          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.output.relatedData");
4912        }
4913        else
4914          return super.addChild(name);
4915      }
4916
4917      public PlanDefinitionActionOutputComponent copy() {
4918        PlanDefinitionActionOutputComponent dst = new PlanDefinitionActionOutputComponent();
4919        copyValues(dst);
4920        return dst;
4921      }
4922
4923      public void copyValues(PlanDefinitionActionOutputComponent dst) {
4924        super.copyValues(dst);
4925        dst.title = title == null ? null : title.copy();
4926        dst.requirement = requirement == null ? null : requirement.copy();
4927        dst.relatedData = relatedData == null ? null : relatedData.copy();
4928      }
4929
4930      @Override
4931      public boolean equalsDeep(Base other_) {
4932        if (!super.equalsDeep(other_))
4933          return false;
4934        if (!(other_ instanceof PlanDefinitionActionOutputComponent))
4935          return false;
4936        PlanDefinitionActionOutputComponent o = (PlanDefinitionActionOutputComponent) other_;
4937        return compareDeep(title, o.title, true) && compareDeep(requirement, o.requirement, true) && compareDeep(relatedData, o.relatedData, true)
4938          ;
4939      }
4940
4941      @Override
4942      public boolean equalsShallow(Base other_) {
4943        if (!super.equalsShallow(other_))
4944          return false;
4945        if (!(other_ instanceof PlanDefinitionActionOutputComponent))
4946          return false;
4947        PlanDefinitionActionOutputComponent o = (PlanDefinitionActionOutputComponent) other_;
4948        return compareValues(title, o.title, true) && compareValues(relatedData, o.relatedData, true);
4949      }
4950
4951      public boolean isEmpty() {
4952        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(title, requirement, relatedData
4953          );
4954      }
4955
4956  public String fhirType() {
4957    return "PlanDefinition.action.output";
4958
4959  }
4960
4961  }
4962
4963    @Block()
4964    public static class PlanDefinitionActionRelatedActionComponent extends BackboneElement implements IBaseBackboneElement {
4965        /**
4966         * The element id of the target related action.
4967         */
4968        @Child(name = "targetId", type = {IdType.class}, order=1, min=1, max=1, modifier=false, summary=false)
4969        @Description(shortDefinition="What action is this related to", formalDefinition="The element id of the target related action." )
4970        protected IdType targetId;
4971
4972        /**
4973         * The relationship of the start of this action to the related action.
4974         */
4975        @Child(name = "relationship", type = {CodeType.class}, order=2, min=1, max=1, modifier=false, summary=false)
4976        @Description(shortDefinition="before | before-start | before-end | concurrent | concurrent-with-start | concurrent-with-end | after | after-start | after-end", formalDefinition="The relationship of the start of this action to the related action." )
4977        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-relationship-type")
4978        protected Enumeration<ActionRelationshipType> relationship;
4979
4980        /**
4981         * The relationship of the end of this action to the related action.
4982         */
4983        @Child(name = "endRelationship", type = {CodeType.class}, order=3, min=0, max=1, modifier=false, summary=false)
4984        @Description(shortDefinition="before | before-start | before-end | concurrent | concurrent-with-start | concurrent-with-end | after | after-start | after-end", formalDefinition="The relationship of the end of this action to the related action." )
4985        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-relationship-type")
4986        protected Enumeration<ActionRelationshipType> endRelationship;
4987
4988        /**
4989         * A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.
4990         */
4991        @Child(name = "offset", type = {Duration.class, Range.class}, order=4, min=0, max=1, modifier=false, summary=false)
4992        @Description(shortDefinition="Time offset for the relationship", formalDefinition="A duration or range of durations to apply to the relationship. For example, 30-60 minutes before." )
4993        protected DataType offset;
4994
4995        private static final long serialVersionUID = 1997058061L;
4996
4997    /**
4998     * Constructor
4999     */
5000      public PlanDefinitionActionRelatedActionComponent() {
5001        super();
5002      }
5003
5004    /**
5005     * Constructor
5006     */
5007      public PlanDefinitionActionRelatedActionComponent(String targetId, ActionRelationshipType relationship) {
5008        super();
5009        this.setTargetId(targetId);
5010        this.setRelationship(relationship);
5011      }
5012
5013        /**
5014         * @return {@link #targetId} (The element id of the target related action.). This is the underlying object with id, value and extensions. The accessor "getTargetId" gives direct access to the value
5015         */
5016        public IdType getTargetIdElement() { 
5017          if (this.targetId == null)
5018            if (Configuration.errorOnAutoCreate())
5019              throw new Error("Attempt to auto-create PlanDefinitionActionRelatedActionComponent.targetId");
5020            else if (Configuration.doAutoCreate())
5021              this.targetId = new IdType(); // bb
5022          return this.targetId;
5023        }
5024
5025        public boolean hasTargetIdElement() { 
5026          return this.targetId != null && !this.targetId.isEmpty();
5027        }
5028
5029        public boolean hasTargetId() { 
5030          return this.targetId != null && !this.targetId.isEmpty();
5031        }
5032
5033        /**
5034         * @param value {@link #targetId} (The element id of the target related action.). This is the underlying object with id, value and extensions. The accessor "getTargetId" gives direct access to the value
5035         */
5036        public PlanDefinitionActionRelatedActionComponent setTargetIdElement(IdType value) { 
5037          this.targetId = value;
5038          return this;
5039        }
5040
5041        /**
5042         * @return The element id of the target related action.
5043         */
5044        public String getTargetId() { 
5045          return this.targetId == null ? null : this.targetId.getValue();
5046        }
5047
5048        /**
5049         * @param value The element id of the target related action.
5050         */
5051        public PlanDefinitionActionRelatedActionComponent setTargetId(String value) { 
5052            if (this.targetId == null)
5053              this.targetId = new IdType();
5054            this.targetId.setValue(value);
5055          return this;
5056        }
5057
5058        /**
5059         * @return {@link #relationship} (The relationship of the start of this action to the related action.). This is the underlying object with id, value and extensions. The accessor "getRelationship" gives direct access to the value
5060         */
5061        public Enumeration<ActionRelationshipType> getRelationshipElement() { 
5062          if (this.relationship == null)
5063            if (Configuration.errorOnAutoCreate())
5064              throw new Error("Attempt to auto-create PlanDefinitionActionRelatedActionComponent.relationship");
5065            else if (Configuration.doAutoCreate())
5066              this.relationship = new Enumeration<ActionRelationshipType>(new ActionRelationshipTypeEnumFactory()); // bb
5067          return this.relationship;
5068        }
5069
5070        public boolean hasRelationshipElement() { 
5071          return this.relationship != null && !this.relationship.isEmpty();
5072        }
5073
5074        public boolean hasRelationship() { 
5075          return this.relationship != null && !this.relationship.isEmpty();
5076        }
5077
5078        /**
5079         * @param value {@link #relationship} (The relationship of the start of this action to the related action.). This is the underlying object with id, value and extensions. The accessor "getRelationship" gives direct access to the value
5080         */
5081        public PlanDefinitionActionRelatedActionComponent setRelationshipElement(Enumeration<ActionRelationshipType> value) { 
5082          this.relationship = value;
5083          return this;
5084        }
5085
5086        /**
5087         * @return The relationship of the start of this action to the related action.
5088         */
5089        public ActionRelationshipType getRelationship() { 
5090          return this.relationship == null ? null : this.relationship.getValue();
5091        }
5092
5093        /**
5094         * @param value The relationship of the start of this action to the related action.
5095         */
5096        public PlanDefinitionActionRelatedActionComponent setRelationship(ActionRelationshipType value) { 
5097            if (this.relationship == null)
5098              this.relationship = new Enumeration<ActionRelationshipType>(new ActionRelationshipTypeEnumFactory());
5099            this.relationship.setValue(value);
5100          return this;
5101        }
5102
5103        /**
5104         * @return {@link #endRelationship} (The relationship of the end of this action to the related action.). This is the underlying object with id, value and extensions. The accessor "getEndRelationship" gives direct access to the value
5105         */
5106        public Enumeration<ActionRelationshipType> getEndRelationshipElement() { 
5107          if (this.endRelationship == null)
5108            if (Configuration.errorOnAutoCreate())
5109              throw new Error("Attempt to auto-create PlanDefinitionActionRelatedActionComponent.endRelationship");
5110            else if (Configuration.doAutoCreate())
5111              this.endRelationship = new Enumeration<ActionRelationshipType>(new ActionRelationshipTypeEnumFactory()); // bb
5112          return this.endRelationship;
5113        }
5114
5115        public boolean hasEndRelationshipElement() { 
5116          return this.endRelationship != null && !this.endRelationship.isEmpty();
5117        }
5118
5119        public boolean hasEndRelationship() { 
5120          return this.endRelationship != null && !this.endRelationship.isEmpty();
5121        }
5122
5123        /**
5124         * @param value {@link #endRelationship} (The relationship of the end of this action to the related action.). This is the underlying object with id, value and extensions. The accessor "getEndRelationship" gives direct access to the value
5125         */
5126        public PlanDefinitionActionRelatedActionComponent setEndRelationshipElement(Enumeration<ActionRelationshipType> value) { 
5127          this.endRelationship = value;
5128          return this;
5129        }
5130
5131        /**
5132         * @return The relationship of the end of this action to the related action.
5133         */
5134        public ActionRelationshipType getEndRelationship() { 
5135          return this.endRelationship == null ? null : this.endRelationship.getValue();
5136        }
5137
5138        /**
5139         * @param value The relationship of the end of this action to the related action.
5140         */
5141        public PlanDefinitionActionRelatedActionComponent setEndRelationship(ActionRelationshipType value) { 
5142          if (value == null)
5143            this.endRelationship = null;
5144          else {
5145            if (this.endRelationship == null)
5146              this.endRelationship = new Enumeration<ActionRelationshipType>(new ActionRelationshipTypeEnumFactory());
5147            this.endRelationship.setValue(value);
5148          }
5149          return this;
5150        }
5151
5152        /**
5153         * @return {@link #offset} (A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.)
5154         */
5155        public DataType getOffset() { 
5156          return this.offset;
5157        }
5158
5159        /**
5160         * @return {@link #offset} (A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.)
5161         */
5162        public Duration getOffsetDuration() throws FHIRException { 
5163          if (this.offset == null)
5164            this.offset = new Duration();
5165          if (!(this.offset instanceof Duration))
5166            throw new FHIRException("Type mismatch: the type Duration was expected, but "+this.offset.getClass().getName()+" was encountered");
5167          return (Duration) this.offset;
5168        }
5169
5170        public boolean hasOffsetDuration() { 
5171          return this != null && this.offset instanceof Duration;
5172        }
5173
5174        /**
5175         * @return {@link #offset} (A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.)
5176         */
5177        public Range getOffsetRange() throws FHIRException { 
5178          if (this.offset == null)
5179            this.offset = new Range();
5180          if (!(this.offset instanceof Range))
5181            throw new FHIRException("Type mismatch: the type Range was expected, but "+this.offset.getClass().getName()+" was encountered");
5182          return (Range) this.offset;
5183        }
5184
5185        public boolean hasOffsetRange() { 
5186          return this != null && this.offset instanceof Range;
5187        }
5188
5189        public boolean hasOffset() { 
5190          return this.offset != null && !this.offset.isEmpty();
5191        }
5192
5193        /**
5194         * @param value {@link #offset} (A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.)
5195         */
5196        public PlanDefinitionActionRelatedActionComponent setOffset(DataType value) { 
5197          if (value != null && !(value instanceof Duration || value instanceof Range))
5198            throw new FHIRException("Not the right type for PlanDefinition.action.relatedAction.offset[x]: "+value.fhirType());
5199          this.offset = value;
5200          return this;
5201        }
5202
5203        protected void listChildren(List<Property> children) {
5204          super.listChildren(children);
5205          children.add(new Property("targetId", "id", "The element id of the target related action.", 0, 1, targetId));
5206          children.add(new Property("relationship", "code", "The relationship of the start of this action to the related action.", 0, 1, relationship));
5207          children.add(new Property("endRelationship", "code", "The relationship of the end of this action to the related action.", 0, 1, endRelationship));
5208          children.add(new Property("offset[x]", "Duration|Range", "A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.", 0, 1, offset));
5209        }
5210
5211        @Override
5212        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5213          switch (_hash) {
5214          case -441951604: /*targetId*/  return new Property("targetId", "id", "The element id of the target related action.", 0, 1, targetId);
5215          case -261851592: /*relationship*/  return new Property("relationship", "code", "The relationship of the start of this action to the related action.", 0, 1, relationship);
5216          case -1506024781: /*endRelationship*/  return new Property("endRelationship", "code", "The relationship of the end of this action to the related action.", 0, 1, endRelationship);
5217          case -1960684787: /*offset[x]*/  return new Property("offset[x]", "Duration|Range", "A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.", 0, 1, offset);
5218          case -1019779949: /*offset*/  return new Property("offset[x]", "Duration|Range", "A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.", 0, 1, offset);
5219          case 134075207: /*offsetDuration*/  return new Property("offset[x]", "Duration", "A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.", 0, 1, offset);
5220          case 1263585386: /*offsetRange*/  return new Property("offset[x]", "Range", "A duration or range of durations to apply to the relationship. For example, 30-60 minutes before.", 0, 1, offset);
5221          default: return super.getNamedProperty(_hash, _name, _checkValid);
5222          }
5223
5224        }
5225
5226      @Override
5227      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5228        switch (hash) {
5229        case -441951604: /*targetId*/ return this.targetId == null ? new Base[0] : new Base[] {this.targetId}; // IdType
5230        case -261851592: /*relationship*/ return this.relationship == null ? new Base[0] : new Base[] {this.relationship}; // Enumeration<ActionRelationshipType>
5231        case -1506024781: /*endRelationship*/ return this.endRelationship == null ? new Base[0] : new Base[] {this.endRelationship}; // Enumeration<ActionRelationshipType>
5232        case -1019779949: /*offset*/ return this.offset == null ? new Base[0] : new Base[] {this.offset}; // DataType
5233        default: return super.getProperty(hash, name, checkValid);
5234        }
5235
5236      }
5237
5238      @Override
5239      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5240        switch (hash) {
5241        case -441951604: // targetId
5242          this.targetId = TypeConvertor.castToId(value); // IdType
5243          return value;
5244        case -261851592: // relationship
5245          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5246          this.relationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5247          return value;
5248        case -1506024781: // endRelationship
5249          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5250          this.endRelationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5251          return value;
5252        case -1019779949: // offset
5253          this.offset = TypeConvertor.castToType(value); // DataType
5254          return value;
5255        default: return super.setProperty(hash, name, value);
5256        }
5257
5258      }
5259
5260      @Override
5261      public Base setProperty(String name, Base value) throws FHIRException {
5262        if (name.equals("targetId")) {
5263          this.targetId = TypeConvertor.castToId(value); // IdType
5264        } else if (name.equals("relationship")) {
5265          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5266          this.relationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5267        } else if (name.equals("endRelationship")) {
5268          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5269          this.endRelationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5270        } else if (name.equals("offset[x]")) {
5271          this.offset = TypeConvertor.castToType(value); // DataType
5272        } else
5273          return super.setProperty(name, value);
5274        return value;
5275      }
5276
5277  @Override
5278  public void removeChild(String name, Base value) throws FHIRException {
5279        if (name.equals("targetId")) {
5280          this.targetId = null;
5281        } else if (name.equals("relationship")) {
5282          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5283          this.relationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5284        } else if (name.equals("endRelationship")) {
5285          value = new ActionRelationshipTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5286          this.endRelationship = (Enumeration) value; // Enumeration<ActionRelationshipType>
5287        } else if (name.equals("offset[x]")) {
5288          this.offset = null;
5289        } else
5290          super.removeChild(name, value);
5291        
5292      }
5293
5294      @Override
5295      public Base makeProperty(int hash, String name) throws FHIRException {
5296        switch (hash) {
5297        case -441951604:  return getTargetIdElement();
5298        case -261851592:  return getRelationshipElement();
5299        case -1506024781:  return getEndRelationshipElement();
5300        case -1960684787:  return getOffset();
5301        case -1019779949:  return getOffset();
5302        default: return super.makeProperty(hash, name);
5303        }
5304
5305      }
5306
5307      @Override
5308      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5309        switch (hash) {
5310        case -441951604: /*targetId*/ return new String[] {"id"};
5311        case -261851592: /*relationship*/ return new String[] {"code"};
5312        case -1506024781: /*endRelationship*/ return new String[] {"code"};
5313        case -1019779949: /*offset*/ return new String[] {"Duration", "Range"};
5314        default: return super.getTypesForProperty(hash, name);
5315        }
5316
5317      }
5318
5319      @Override
5320      public Base addChild(String name) throws FHIRException {
5321        if (name.equals("targetId")) {
5322          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.relatedAction.targetId");
5323        }
5324        else if (name.equals("relationship")) {
5325          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.relatedAction.relationship");
5326        }
5327        else if (name.equals("endRelationship")) {
5328          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.relatedAction.endRelationship");
5329        }
5330        else if (name.equals("offsetDuration")) {
5331          this.offset = new Duration();
5332          return this.offset;
5333        }
5334        else if (name.equals("offsetRange")) {
5335          this.offset = new Range();
5336          return this.offset;
5337        }
5338        else
5339          return super.addChild(name);
5340      }
5341
5342      public PlanDefinitionActionRelatedActionComponent copy() {
5343        PlanDefinitionActionRelatedActionComponent dst = new PlanDefinitionActionRelatedActionComponent();
5344        copyValues(dst);
5345        return dst;
5346      }
5347
5348      public void copyValues(PlanDefinitionActionRelatedActionComponent dst) {
5349        super.copyValues(dst);
5350        dst.targetId = targetId == null ? null : targetId.copy();
5351        dst.relationship = relationship == null ? null : relationship.copy();
5352        dst.endRelationship = endRelationship == null ? null : endRelationship.copy();
5353        dst.offset = offset == null ? null : offset.copy();
5354      }
5355
5356      @Override
5357      public boolean equalsDeep(Base other_) {
5358        if (!super.equalsDeep(other_))
5359          return false;
5360        if (!(other_ instanceof PlanDefinitionActionRelatedActionComponent))
5361          return false;
5362        PlanDefinitionActionRelatedActionComponent o = (PlanDefinitionActionRelatedActionComponent) other_;
5363        return compareDeep(targetId, o.targetId, true) && compareDeep(relationship, o.relationship, true)
5364           && compareDeep(endRelationship, o.endRelationship, true) && compareDeep(offset, o.offset, true)
5365          ;
5366      }
5367
5368      @Override
5369      public boolean equalsShallow(Base other_) {
5370        if (!super.equalsShallow(other_))
5371          return false;
5372        if (!(other_ instanceof PlanDefinitionActionRelatedActionComponent))
5373          return false;
5374        PlanDefinitionActionRelatedActionComponent o = (PlanDefinitionActionRelatedActionComponent) other_;
5375        return compareValues(targetId, o.targetId, true) && compareValues(relationship, o.relationship, true)
5376           && compareValues(endRelationship, o.endRelationship, true);
5377      }
5378
5379      public boolean isEmpty() {
5380        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(targetId, relationship, endRelationship
5381          , offset);
5382      }
5383
5384  public String fhirType() {
5385    return "PlanDefinition.action.relatedAction";
5386
5387  }
5388
5389  }
5390
5391    @Block()
5392    public static class PlanDefinitionActionParticipantComponent extends BackboneElement implements IBaseBackboneElement {
5393        /**
5394         * A reference to the id element of the actor who will participate in this action.
5395         */
5396        @Child(name = "actorId", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
5397        @Description(shortDefinition="What actor", formalDefinition="A reference to the id element of the actor who will participate in this action." )
5398        protected StringType actorId;
5399
5400        /**
5401         * The type of participant in the action.
5402         */
5403        @Child(name = "type", type = {CodeType.class}, order=2, min=0, max=1, modifier=false, summary=false)
5404        @Description(shortDefinition="careteam | device | group | healthcareservice | location | organization | patient | practitioner | practitionerrole | relatedperson", formalDefinition="The type of participant in the action." )
5405        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-participant-type")
5406        protected Enumeration<ActionParticipantType> type;
5407
5408        /**
5409         * The type of participant in the action.
5410         */
5411        @Child(name = "typeCanonical", type = {CanonicalType.class}, order=3, min=0, max=1, modifier=false, summary=false)
5412        @Description(shortDefinition="Who or what can participate", formalDefinition="The type of participant in the action." )
5413        protected CanonicalType typeCanonical;
5414
5415        /**
5416         * The type of participant in the action.
5417         */
5418        @Child(name = "typeReference", type = {CareTeam.class, Device.class, DeviceDefinition.class, Endpoint.class, Group.class, HealthcareService.class, Location.class, Organization.class, Patient.class, Practitioner.class, PractitionerRole.class, RelatedPerson.class}, order=4, min=0, max=1, modifier=false, summary=false)
5419        @Description(shortDefinition="Who or what can participate", formalDefinition="The type of participant in the action." )
5420        protected Reference typeReference;
5421
5422        /**
5423         * The role the participant should play in performing the described action.
5424         */
5425        @Child(name = "role", type = {CodeableConcept.class}, order=5, min=0, max=1, modifier=false, summary=false)
5426        @Description(shortDefinition="E.g. Nurse, Surgeon, Parent", formalDefinition="The role the participant should play in performing the described action." )
5427        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://terminology.hl7.org/ValueSet/action-participant-role")
5428        protected CodeableConcept role;
5429
5430        /**
5431         * Indicates how the actor will be involved in the action - author, reviewer, witness, etc.
5432         */
5433        @Child(name = "function", type = {CodeableConcept.class}, order=6, min=0, max=1, modifier=false, summary=false)
5434        @Description(shortDefinition="E.g. Author, Reviewer, Witness, etc", formalDefinition="Indicates how the actor will be involved in the action - author, reviewer, witness, etc." )
5435        @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/action-participant-function")
5436        protected CodeableConcept function;
5437
5438        private static final long serialVersionUID = -1467052283L;
5439
5440    /**
5441     * Constructor
5442     */
5443      public PlanDefinitionActionParticipantComponent() {
5444        super();
5445      }
5446
5447        /**
5448         * @return {@link #actorId} (A reference to the id element of the actor who will participate in this action.). This is the underlying object with id, value and extensions. The accessor "getActorId" gives direct access to the value
5449         */
5450        public StringType getActorIdElement() { 
5451          if (this.actorId == null)
5452            if (Configuration.errorOnAutoCreate())
5453              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.actorId");
5454            else if (Configuration.doAutoCreate())
5455              this.actorId = new StringType(); // bb
5456          return this.actorId;
5457        }
5458
5459        public boolean hasActorIdElement() { 
5460          return this.actorId != null && !this.actorId.isEmpty();
5461        }
5462
5463        public boolean hasActorId() { 
5464          return this.actorId != null && !this.actorId.isEmpty();
5465        }
5466
5467        /**
5468         * @param value {@link #actorId} (A reference to the id element of the actor who will participate in this action.). This is the underlying object with id, value and extensions. The accessor "getActorId" gives direct access to the value
5469         */
5470        public PlanDefinitionActionParticipantComponent setActorIdElement(StringType value) { 
5471          this.actorId = value;
5472          return this;
5473        }
5474
5475        /**
5476         * @return A reference to the id element of the actor who will participate in this action.
5477         */
5478        public String getActorId() { 
5479          return this.actorId == null ? null : this.actorId.getValue();
5480        }
5481
5482        /**
5483         * @param value A reference to the id element of the actor who will participate in this action.
5484         */
5485        public PlanDefinitionActionParticipantComponent setActorId(String value) { 
5486          if (Utilities.noString(value))
5487            this.actorId = null;
5488          else {
5489            if (this.actorId == null)
5490              this.actorId = new StringType();
5491            this.actorId.setValue(value);
5492          }
5493          return this;
5494        }
5495
5496        /**
5497         * @return {@link #type} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
5498         */
5499        public Enumeration<ActionParticipantType> getTypeElement() { 
5500          if (this.type == null)
5501            if (Configuration.errorOnAutoCreate())
5502              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.type");
5503            else if (Configuration.doAutoCreate())
5504              this.type = new Enumeration<ActionParticipantType>(new ActionParticipantTypeEnumFactory()); // bb
5505          return this.type;
5506        }
5507
5508        public boolean hasTypeElement() { 
5509          return this.type != null && !this.type.isEmpty();
5510        }
5511
5512        public boolean hasType() { 
5513          return this.type != null && !this.type.isEmpty();
5514        }
5515
5516        /**
5517         * @param value {@link #type} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getType" gives direct access to the value
5518         */
5519        public PlanDefinitionActionParticipantComponent setTypeElement(Enumeration<ActionParticipantType> value) { 
5520          this.type = value;
5521          return this;
5522        }
5523
5524        /**
5525         * @return The type of participant in the action.
5526         */
5527        public ActionParticipantType getType() { 
5528          return this.type == null ? null : this.type.getValue();
5529        }
5530
5531        /**
5532         * @param value The type of participant in the action.
5533         */
5534        public PlanDefinitionActionParticipantComponent setType(ActionParticipantType value) { 
5535          if (value == null)
5536            this.type = null;
5537          else {
5538            if (this.type == null)
5539              this.type = new Enumeration<ActionParticipantType>(new ActionParticipantTypeEnumFactory());
5540            this.type.setValue(value);
5541          }
5542          return this;
5543        }
5544
5545        /**
5546         * @return {@link #typeCanonical} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getTypeCanonical" gives direct access to the value
5547         */
5548        public CanonicalType getTypeCanonicalElement() { 
5549          if (this.typeCanonical == null)
5550            if (Configuration.errorOnAutoCreate())
5551              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.typeCanonical");
5552            else if (Configuration.doAutoCreate())
5553              this.typeCanonical = new CanonicalType(); // bb
5554          return this.typeCanonical;
5555        }
5556
5557        public boolean hasTypeCanonicalElement() { 
5558          return this.typeCanonical != null && !this.typeCanonical.isEmpty();
5559        }
5560
5561        public boolean hasTypeCanonical() { 
5562          return this.typeCanonical != null && !this.typeCanonical.isEmpty();
5563        }
5564
5565        /**
5566         * @param value {@link #typeCanonical} (The type of participant in the action.). This is the underlying object with id, value and extensions. The accessor "getTypeCanonical" gives direct access to the value
5567         */
5568        public PlanDefinitionActionParticipantComponent setTypeCanonicalElement(CanonicalType value) { 
5569          this.typeCanonical = value;
5570          return this;
5571        }
5572
5573        /**
5574         * @return The type of participant in the action.
5575         */
5576        public String getTypeCanonical() { 
5577          return this.typeCanonical == null ? null : this.typeCanonical.getValue();
5578        }
5579
5580        /**
5581         * @param value The type of participant in the action.
5582         */
5583        public PlanDefinitionActionParticipantComponent setTypeCanonical(String value) { 
5584          if (Utilities.noString(value))
5585            this.typeCanonical = null;
5586          else {
5587            if (this.typeCanonical == null)
5588              this.typeCanonical = new CanonicalType();
5589            this.typeCanonical.setValue(value);
5590          }
5591          return this;
5592        }
5593
5594        /**
5595         * @return {@link #typeReference} (The type of participant in the action.)
5596         */
5597        public Reference getTypeReference() { 
5598          if (this.typeReference == null)
5599            if (Configuration.errorOnAutoCreate())
5600              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.typeReference");
5601            else if (Configuration.doAutoCreate())
5602              this.typeReference = new Reference(); // cc
5603          return this.typeReference;
5604        }
5605
5606        public boolean hasTypeReference() { 
5607          return this.typeReference != null && !this.typeReference.isEmpty();
5608        }
5609
5610        /**
5611         * @param value {@link #typeReference} (The type of participant in the action.)
5612         */
5613        public PlanDefinitionActionParticipantComponent setTypeReference(Reference value) { 
5614          this.typeReference = value;
5615          return this;
5616        }
5617
5618        /**
5619         * @return {@link #role} (The role the participant should play in performing the described action.)
5620         */
5621        public CodeableConcept getRole() { 
5622          if (this.role == null)
5623            if (Configuration.errorOnAutoCreate())
5624              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.role");
5625            else if (Configuration.doAutoCreate())
5626              this.role = new CodeableConcept(); // cc
5627          return this.role;
5628        }
5629
5630        public boolean hasRole() { 
5631          return this.role != null && !this.role.isEmpty();
5632        }
5633
5634        /**
5635         * @param value {@link #role} (The role the participant should play in performing the described action.)
5636         */
5637        public PlanDefinitionActionParticipantComponent setRole(CodeableConcept value) { 
5638          this.role = value;
5639          return this;
5640        }
5641
5642        /**
5643         * @return {@link #function} (Indicates how the actor will be involved in the action - author, reviewer, witness, etc.)
5644         */
5645        public CodeableConcept getFunction() { 
5646          if (this.function == null)
5647            if (Configuration.errorOnAutoCreate())
5648              throw new Error("Attempt to auto-create PlanDefinitionActionParticipantComponent.function");
5649            else if (Configuration.doAutoCreate())
5650              this.function = new CodeableConcept(); // cc
5651          return this.function;
5652        }
5653
5654        public boolean hasFunction() { 
5655          return this.function != null && !this.function.isEmpty();
5656        }
5657
5658        /**
5659         * @param value {@link #function} (Indicates how the actor will be involved in the action - author, reviewer, witness, etc.)
5660         */
5661        public PlanDefinitionActionParticipantComponent setFunction(CodeableConcept value) { 
5662          this.function = value;
5663          return this;
5664        }
5665
5666        protected void listChildren(List<Property> children) {
5667          super.listChildren(children);
5668          children.add(new Property("actorId", "string", "A reference to the id element of the actor who will participate in this action.", 0, 1, actorId));
5669          children.add(new Property("type", "code", "The type of participant in the action.", 0, 1, type));
5670          children.add(new Property("typeCanonical", "canonical(CapabilityStatement)", "The type of participant in the action.", 0, 1, typeCanonical));
5671          children.add(new Property("typeReference", "Reference(CareTeam|Device|DeviceDefinition|Endpoint|Group|HealthcareService|Location|Organization|Patient|Practitioner|PractitionerRole|RelatedPerson)", "The type of participant in the action.", 0, 1, typeReference));
5672          children.add(new Property("role", "CodeableConcept", "The role the participant should play in performing the described action.", 0, 1, role));
5673          children.add(new Property("function", "CodeableConcept", "Indicates how the actor will be involved in the action - author, reviewer, witness, etc.", 0, 1, function));
5674        }
5675
5676        @Override
5677        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5678          switch (_hash) {
5679          case -1161623056: /*actorId*/  return new Property("actorId", "string", "A reference to the id element of the actor who will participate in this action.", 0, 1, actorId);
5680          case 3575610: /*type*/  return new Property("type", "code", "The type of participant in the action.", 0, 1, type);
5681          case -466635046: /*typeCanonical*/  return new Property("typeCanonical", "canonical(CapabilityStatement)", "The type of participant in the action.", 0, 1, typeCanonical);
5682          case 2074825009: /*typeReference*/  return new Property("typeReference", "Reference(CareTeam|Device|DeviceDefinition|Endpoint|Group|HealthcareService|Location|Organization|Patient|Practitioner|PractitionerRole|RelatedPerson)", "The type of participant in the action.", 0, 1, typeReference);
5683          case 3506294: /*role*/  return new Property("role", "CodeableConcept", "The role the participant should play in performing the described action.", 0, 1, role);
5684          case 1380938712: /*function*/  return new Property("function", "CodeableConcept", "Indicates how the actor will be involved in the action - author, reviewer, witness, etc.", 0, 1, function);
5685          default: return super.getNamedProperty(_hash, _name, _checkValid);
5686          }
5687
5688        }
5689
5690      @Override
5691      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5692        switch (hash) {
5693        case -1161623056: /*actorId*/ return this.actorId == null ? new Base[0] : new Base[] {this.actorId}; // StringType
5694        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // Enumeration<ActionParticipantType>
5695        case -466635046: /*typeCanonical*/ return this.typeCanonical == null ? new Base[0] : new Base[] {this.typeCanonical}; // CanonicalType
5696        case 2074825009: /*typeReference*/ return this.typeReference == null ? new Base[0] : new Base[] {this.typeReference}; // Reference
5697        case 3506294: /*role*/ return this.role == null ? new Base[0] : new Base[] {this.role}; // CodeableConcept
5698        case 1380938712: /*function*/ return this.function == null ? new Base[0] : new Base[] {this.function}; // CodeableConcept
5699        default: return super.getProperty(hash, name, checkValid);
5700        }
5701
5702      }
5703
5704      @Override
5705      public Base setProperty(int hash, String name, Base value) throws FHIRException {
5706        switch (hash) {
5707        case -1161623056: // actorId
5708          this.actorId = TypeConvertor.castToString(value); // StringType
5709          return value;
5710        case 3575610: // type
5711          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5712          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
5713          return value;
5714        case -466635046: // typeCanonical
5715          this.typeCanonical = TypeConvertor.castToCanonical(value); // CanonicalType
5716          return value;
5717        case 2074825009: // typeReference
5718          this.typeReference = TypeConvertor.castToReference(value); // Reference
5719          return value;
5720        case 3506294: // role
5721          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5722          return value;
5723        case 1380938712: // function
5724          this.function = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5725          return value;
5726        default: return super.setProperty(hash, name, value);
5727        }
5728
5729      }
5730
5731      @Override
5732      public Base setProperty(String name, Base value) throws FHIRException {
5733        if (name.equals("actorId")) {
5734          this.actorId = TypeConvertor.castToString(value); // StringType
5735        } else if (name.equals("type")) {
5736          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5737          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
5738        } else if (name.equals("typeCanonical")) {
5739          this.typeCanonical = TypeConvertor.castToCanonical(value); // CanonicalType
5740        } else if (name.equals("typeReference")) {
5741          this.typeReference = TypeConvertor.castToReference(value); // Reference
5742        } else if (name.equals("role")) {
5743          this.role = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5744        } else if (name.equals("function")) {
5745          this.function = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
5746        } else
5747          return super.setProperty(name, value);
5748        return value;
5749      }
5750
5751  @Override
5752  public void removeChild(String name, Base value) throws FHIRException {
5753        if (name.equals("actorId")) {
5754          this.actorId = null;
5755        } else if (name.equals("type")) {
5756          value = new ActionParticipantTypeEnumFactory().fromType(TypeConvertor.castToCode(value));
5757          this.type = (Enumeration) value; // Enumeration<ActionParticipantType>
5758        } else if (name.equals("typeCanonical")) {
5759          this.typeCanonical = null;
5760        } else if (name.equals("typeReference")) {
5761          this.typeReference = null;
5762        } else if (name.equals("role")) {
5763          this.role = null;
5764        } else if (name.equals("function")) {
5765          this.function = null;
5766        } else
5767          super.removeChild(name, value);
5768        
5769      }
5770
5771      @Override
5772      public Base makeProperty(int hash, String name) throws FHIRException {
5773        switch (hash) {
5774        case -1161623056:  return getActorIdElement();
5775        case 3575610:  return getTypeElement();
5776        case -466635046:  return getTypeCanonicalElement();
5777        case 2074825009:  return getTypeReference();
5778        case 3506294:  return getRole();
5779        case 1380938712:  return getFunction();
5780        default: return super.makeProperty(hash, name);
5781        }
5782
5783      }
5784
5785      @Override
5786      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
5787        switch (hash) {
5788        case -1161623056: /*actorId*/ return new String[] {"string"};
5789        case 3575610: /*type*/ return new String[] {"code"};
5790        case -466635046: /*typeCanonical*/ return new String[] {"canonical"};
5791        case 2074825009: /*typeReference*/ return new String[] {"Reference"};
5792        case 3506294: /*role*/ return new String[] {"CodeableConcept"};
5793        case 1380938712: /*function*/ return new String[] {"CodeableConcept"};
5794        default: return super.getTypesForProperty(hash, name);
5795        }
5796
5797      }
5798
5799      @Override
5800      public Base addChild(String name) throws FHIRException {
5801        if (name.equals("actorId")) {
5802          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.participant.actorId");
5803        }
5804        else if (name.equals("type")) {
5805          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.participant.type");
5806        }
5807        else if (name.equals("typeCanonical")) {
5808          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.participant.typeCanonical");
5809        }
5810        else if (name.equals("typeReference")) {
5811          this.typeReference = new Reference();
5812          return this.typeReference;
5813        }
5814        else if (name.equals("role")) {
5815          this.role = new CodeableConcept();
5816          return this.role;
5817        }
5818        else if (name.equals("function")) {
5819          this.function = new CodeableConcept();
5820          return this.function;
5821        }
5822        else
5823          return super.addChild(name);
5824      }
5825
5826      public PlanDefinitionActionParticipantComponent copy() {
5827        PlanDefinitionActionParticipantComponent dst = new PlanDefinitionActionParticipantComponent();
5828        copyValues(dst);
5829        return dst;
5830      }
5831
5832      public void copyValues(PlanDefinitionActionParticipantComponent dst) {
5833        super.copyValues(dst);
5834        dst.actorId = actorId == null ? null : actorId.copy();
5835        dst.type = type == null ? null : type.copy();
5836        dst.typeCanonical = typeCanonical == null ? null : typeCanonical.copy();
5837        dst.typeReference = typeReference == null ? null : typeReference.copy();
5838        dst.role = role == null ? null : role.copy();
5839        dst.function = function == null ? null : function.copy();
5840      }
5841
5842      @Override
5843      public boolean equalsDeep(Base other_) {
5844        if (!super.equalsDeep(other_))
5845          return false;
5846        if (!(other_ instanceof PlanDefinitionActionParticipantComponent))
5847          return false;
5848        PlanDefinitionActionParticipantComponent o = (PlanDefinitionActionParticipantComponent) other_;
5849        return compareDeep(actorId, o.actorId, true) && compareDeep(type, o.type, true) && compareDeep(typeCanonical, o.typeCanonical, true)
5850           && compareDeep(typeReference, o.typeReference, true) && compareDeep(role, o.role, true) && compareDeep(function, o.function, true)
5851          ;
5852      }
5853
5854      @Override
5855      public boolean equalsShallow(Base other_) {
5856        if (!super.equalsShallow(other_))
5857          return false;
5858        if (!(other_ instanceof PlanDefinitionActionParticipantComponent))
5859          return false;
5860        PlanDefinitionActionParticipantComponent o = (PlanDefinitionActionParticipantComponent) other_;
5861        return compareValues(actorId, o.actorId, true) && compareValues(type, o.type, true) && compareValues(typeCanonical, o.typeCanonical, true)
5862          ;
5863      }
5864
5865      public boolean isEmpty() {
5866        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(actorId, type, typeCanonical
5867          , typeReference, role, function);
5868      }
5869
5870  public String fhirType() {
5871    return "PlanDefinition.action.participant";
5872
5873  }
5874
5875  }
5876
5877    @Block()
5878    public static class PlanDefinitionActionDynamicValueComponent extends BackboneElement implements IBaseBackboneElement {
5879        /**
5880         * The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).
5881         */
5882        @Child(name = "path", type = {StringType.class}, order=1, min=0, max=1, modifier=false, summary=false)
5883        @Description(shortDefinition="The path to the element to be set dynamically", formalDefinition="The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details)." )
5884        protected StringType path;
5885
5886        /**
5887         * An expression specifying the value of the customized element.
5888         */
5889        @Child(name = "expression", type = {Expression.class}, order=2, min=0, max=1, modifier=false, summary=false)
5890        @Description(shortDefinition="An expression that provides the dynamic value for the customization", formalDefinition="An expression specifying the value of the customized element." )
5891        protected Expression expression;
5892
5893        private static final long serialVersionUID = 1064529082L;
5894
5895    /**
5896     * Constructor
5897     */
5898      public PlanDefinitionActionDynamicValueComponent() {
5899        super();
5900      }
5901
5902        /**
5903         * @return {@link #path} (The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).). This is the underlying object with id, value and extensions. The accessor "getPath" gives direct access to the value
5904         */
5905        public StringType getPathElement() { 
5906          if (this.path == null)
5907            if (Configuration.errorOnAutoCreate())
5908              throw new Error("Attempt to auto-create PlanDefinitionActionDynamicValueComponent.path");
5909            else if (Configuration.doAutoCreate())
5910              this.path = new StringType(); // bb
5911          return this.path;
5912        }
5913
5914        public boolean hasPathElement() { 
5915          return this.path != null && !this.path.isEmpty();
5916        }
5917
5918        public boolean hasPath() { 
5919          return this.path != null && !this.path.isEmpty();
5920        }
5921
5922        /**
5923         * @param value {@link #path} (The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).). This is the underlying object with id, value and extensions. The accessor "getPath" gives direct access to the value
5924         */
5925        public PlanDefinitionActionDynamicValueComponent setPathElement(StringType value) { 
5926          this.path = value;
5927          return this;
5928        }
5929
5930        /**
5931         * @return The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).
5932         */
5933        public String getPath() { 
5934          return this.path == null ? null : this.path.getValue();
5935        }
5936
5937        /**
5938         * @param value The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).
5939         */
5940        public PlanDefinitionActionDynamicValueComponent setPath(String value) { 
5941          if (Utilities.noString(value))
5942            this.path = null;
5943          else {
5944            if (this.path == null)
5945              this.path = new StringType();
5946            this.path.setValue(value);
5947          }
5948          return this;
5949        }
5950
5951        /**
5952         * @return {@link #expression} (An expression specifying the value of the customized element.)
5953         */
5954        public Expression getExpression() { 
5955          if (this.expression == null)
5956            if (Configuration.errorOnAutoCreate())
5957              throw new Error("Attempt to auto-create PlanDefinitionActionDynamicValueComponent.expression");
5958            else if (Configuration.doAutoCreate())
5959              this.expression = new Expression(); // cc
5960          return this.expression;
5961        }
5962
5963        public boolean hasExpression() { 
5964          return this.expression != null && !this.expression.isEmpty();
5965        }
5966
5967        /**
5968         * @param value {@link #expression} (An expression specifying the value of the customized element.)
5969         */
5970        public PlanDefinitionActionDynamicValueComponent setExpression(Expression value) { 
5971          this.expression = value;
5972          return this;
5973        }
5974
5975        protected void listChildren(List<Property> children) {
5976          super.listChildren(children);
5977          children.add(new Property("path", "string", "The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).", 0, 1, path));
5978          children.add(new Property("expression", "Expression", "An expression specifying the value of the customized element.", 0, 1, expression));
5979        }
5980
5981        @Override
5982        public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
5983          switch (_hash) {
5984          case 3433509: /*path*/  return new Property("path", "string", "The path to the element to be customized. This is the path on the resource that will hold the result of the calculation defined by the expression. The specified path SHALL be a FHIRPath resolvable on the specified target type of the ActivityDefinition, and SHALL consist only of identifiers, constant indexers, and a restricted subset of functions. The path is allowed to contain qualifiers (.) to traverse sub-elements, as well as indexers ([x]) to traverse multiple-cardinality sub-elements (see the [Simple FHIRPath Profile](fhirpath.html#simple) for full details).", 0, 1, path);
5985          case -1795452264: /*expression*/  return new Property("expression", "Expression", "An expression specifying the value of the customized element.", 0, 1, expression);
5986          default: return super.getNamedProperty(_hash, _name, _checkValid);
5987          }
5988
5989        }
5990
5991      @Override
5992      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
5993        switch (hash) {
5994        case 3433509: /*path*/ return this.path == null ? new Base[0] : new Base[] {this.path}; // StringType
5995        case -1795452264: /*expression*/ return this.expression == null ? new Base[0] : new Base[] {this.expression}; // Expression
5996        default: return super.getProperty(hash, name, checkValid);
5997        }
5998
5999      }
6000
6001      @Override
6002      public Base setProperty(int hash, String name, Base value) throws FHIRException {
6003        switch (hash) {
6004        case 3433509: // path
6005          this.path = TypeConvertor.castToString(value); // StringType
6006          return value;
6007        case -1795452264: // expression
6008          this.expression = TypeConvertor.castToExpression(value); // Expression
6009          return value;
6010        default: return super.setProperty(hash, name, value);
6011        }
6012
6013      }
6014
6015      @Override
6016      public Base setProperty(String name, Base value) throws FHIRException {
6017        if (name.equals("path")) {
6018          this.path = TypeConvertor.castToString(value); // StringType
6019        } else if (name.equals("expression")) {
6020          this.expression = TypeConvertor.castToExpression(value); // Expression
6021        } else
6022          return super.setProperty(name, value);
6023        return value;
6024      }
6025
6026  @Override
6027  public void removeChild(String name, Base value) throws FHIRException {
6028        if (name.equals("path")) {
6029          this.path = null;
6030        } else if (name.equals("expression")) {
6031          this.expression = null;
6032        } else
6033          super.removeChild(name, value);
6034        
6035      }
6036
6037      @Override
6038      public Base makeProperty(int hash, String name) throws FHIRException {
6039        switch (hash) {
6040        case 3433509:  return getPathElement();
6041        case -1795452264:  return getExpression();
6042        default: return super.makeProperty(hash, name);
6043        }
6044
6045      }
6046
6047      @Override
6048      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
6049        switch (hash) {
6050        case 3433509: /*path*/ return new String[] {"string"};
6051        case -1795452264: /*expression*/ return new String[] {"Expression"};
6052        default: return super.getTypesForProperty(hash, name);
6053        }
6054
6055      }
6056
6057      @Override
6058      public Base addChild(String name) throws FHIRException {
6059        if (name.equals("path")) {
6060          throw new FHIRException("Cannot call addChild on a singleton property PlanDefinition.action.dynamicValue.path");
6061        }
6062        else if (name.equals("expression")) {
6063          this.expression = new Expression();
6064          return this.expression;
6065        }
6066        else
6067          return super.addChild(name);
6068      }
6069
6070      public PlanDefinitionActionDynamicValueComponent copy() {
6071        PlanDefinitionActionDynamicValueComponent dst = new PlanDefinitionActionDynamicValueComponent();
6072        copyValues(dst);
6073        return dst;
6074      }
6075
6076      public void copyValues(PlanDefinitionActionDynamicValueComponent dst) {
6077        super.copyValues(dst);
6078        dst.path = path == null ? null : path.copy();
6079        dst.expression = expression == null ? null : expression.copy();
6080      }
6081
6082      @Override
6083      public boolean equalsDeep(Base other_) {
6084        if (!super.equalsDeep(other_))
6085          return false;
6086        if (!(other_ instanceof PlanDefinitionActionDynamicValueComponent))
6087          return false;
6088        PlanDefinitionActionDynamicValueComponent o = (PlanDefinitionActionDynamicValueComponent) other_;
6089        return compareDeep(path, o.path, true) && compareDeep(expression, o.expression, true);
6090      }
6091
6092      @Override
6093      public boolean equalsShallow(Base other_) {
6094        if (!super.equalsShallow(other_))
6095          return false;
6096        if (!(other_ instanceof PlanDefinitionActionDynamicValueComponent))
6097          return false;
6098        PlanDefinitionActionDynamicValueComponent o = (PlanDefinitionActionDynamicValueComponent) other_;
6099        return compareValues(path, o.path, true);
6100      }
6101
6102      public boolean isEmpty() {
6103        return super.isEmpty() && ca.uhn.fhir.util.ElementUtil.isEmpty(path, expression);
6104      }
6105
6106  public String fhirType() {
6107    return "PlanDefinition.action.dynamicValue";
6108
6109  }
6110
6111  }
6112
6113    /**
6114     * An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.
6115     */
6116    @Child(name = "url", type = {UriType.class}, order=0, min=0, max=1, modifier=false, summary=true)
6117    @Description(shortDefinition="Canonical identifier for this plan definition, represented as a URI (globally unique)", formalDefinition="An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers." )
6118    protected UriType url;
6119
6120    /**
6121     * A formal identifier that is used to identify this plan definition when it is represented in other formats, or referenced in a specification, model, design or an instance.
6122     */
6123    @Child(name = "identifier", type = {Identifier.class}, order=1, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
6124    @Description(shortDefinition="Additional identifier for the plan definition", formalDefinition="A formal identifier that is used to identify this plan definition when it is represented in other formats, or referenced in a specification, model, design or an instance." )
6125    protected List<Identifier> identifier;
6126
6127    /**
6128     * The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.
6129     */
6130    @Child(name = "version", type = {StringType.class}, order=2, min=0, max=1, modifier=false, summary=true)
6131    @Description(shortDefinition="Business version of the plan definition", formalDefinition="The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts." )
6132    protected StringType version;
6133
6134    /**
6135     * Indicates the mechanism used to compare versions to determine which is more current.
6136     */
6137    @Child(name = "versionAlgorithm", type = {StringType.class, Coding.class}, order=3, min=0, max=1, modifier=false, summary=true)
6138    @Description(shortDefinition="How to compare versions", formalDefinition="Indicates the mechanism used to compare versions to determine which is more current." )
6139    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/version-algorithm")
6140    protected DataType versionAlgorithm;
6141
6142    /**
6143     * A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.
6144     */
6145    @Child(name = "name", type = {StringType.class}, order=4, min=0, max=1, modifier=false, summary=true)
6146    @Description(shortDefinition="Name for this plan definition (computer friendly)", formalDefinition="A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation." )
6147    protected StringType name;
6148
6149    /**
6150     * A short, descriptive, user-friendly title for the plan definition.
6151     */
6152    @Child(name = "title", type = {StringType.class}, order=5, min=0, max=1, modifier=false, summary=true)
6153    @Description(shortDefinition="Name for this plan definition (human friendly)", formalDefinition="A short, descriptive, user-friendly title for the plan definition." )
6154    protected StringType title;
6155
6156    /**
6157     * An explanatory or alternate title for the plan definition giving additional information about its content.
6158     */
6159    @Child(name = "subtitle", type = {StringType.class}, order=6, min=0, max=1, modifier=false, summary=false)
6160    @Description(shortDefinition="Subordinate title of the plan definition", formalDefinition="An explanatory or alternate title for the plan definition giving additional information about its content." )
6161    protected StringType subtitle;
6162
6163    /**
6164     * A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition.
6165     */
6166    @Child(name = "type", type = {CodeableConcept.class}, order=7, min=0, max=1, modifier=false, summary=true)
6167    @Description(shortDefinition="order-set | clinical-protocol | eca-rule | workflow-definition", formalDefinition="A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition." )
6168    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/plan-definition-type")
6169    protected CodeableConcept type;
6170
6171    /**
6172     * The status of this plan definition. Enables tracking the life-cycle of the content.
6173     */
6174    @Child(name = "status", type = {CodeType.class}, order=8, min=1, max=1, modifier=true, summary=true)
6175    @Description(shortDefinition="draft | active | retired | unknown", formalDefinition="The status of this plan definition. Enables tracking the life-cycle of the content." )
6176    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/publication-status")
6177    protected Enumeration<PublicationStatus> status;
6178
6179    /**
6180     * A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
6181     */
6182    @Child(name = "experimental", type = {BooleanType.class}, order=9, min=0, max=1, modifier=false, summary=true)
6183    @Description(shortDefinition="For testing purposes, not real usage", formalDefinition="A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage." )
6184    protected BooleanType experimental;
6185
6186    /**
6187     * A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.
6188     */
6189    @Child(name = "subject", type = {CodeableConcept.class, Group.class, MedicinalProductDefinition.class, SubstanceDefinition.class, AdministrableProductDefinition.class, ManufacturedItemDefinition.class, PackagedProductDefinition.class, CanonicalType.class}, order=10, min=0, max=1, modifier=false, summary=false)
6190    @Description(shortDefinition="Type of individual the plan definition is focused on", formalDefinition="A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource." )
6191    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/participant-resource-types")
6192    protected DataType subject;
6193
6194    /**
6195     * The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.
6196     */
6197    @Child(name = "date", type = {DateTimeType.class}, order=11, min=0, max=1, modifier=false, summary=true)
6198    @Description(shortDefinition="Date last changed", formalDefinition="The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes." )
6199    protected DateTimeType date;
6200
6201    /**
6202     * The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.
6203     */
6204    @Child(name = "publisher", type = {StringType.class}, order=12, min=0, max=1, modifier=false, summary=true)
6205    @Description(shortDefinition="Name of the publisher/steward (organization or individual)", formalDefinition="The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition." )
6206    protected StringType publisher;
6207
6208    /**
6209     * Contact details to assist a user in finding and communicating with the publisher.
6210     */
6211    @Child(name = "contact", type = {ContactDetail.class}, order=13, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
6212    @Description(shortDefinition="Contact details for the publisher", formalDefinition="Contact details to assist a user in finding and communicating with the publisher." )
6213    protected List<ContactDetail> contact;
6214
6215    /**
6216     * A free text natural language description of the plan definition from a consumer's perspective.
6217     */
6218    @Child(name = "description", type = {MarkdownType.class}, order=14, min=0, max=1, modifier=false, summary=true)
6219    @Description(shortDefinition="Natural language description of the plan definition", formalDefinition="A free text natural language description of the plan definition from a consumer's perspective." )
6220    protected MarkdownType description;
6221
6222    /**
6223     * The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate plan definition instances.
6224     */
6225    @Child(name = "useContext", type = {UsageContext.class}, order=15, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
6226    @Description(shortDefinition="The context that the content is intended to support", formalDefinition="The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate plan definition instances." )
6227    protected List<UsageContext> useContext;
6228
6229    /**
6230     * A legal or geographic region in which the plan definition is intended to be used.
6231     */
6232    @Child(name = "jurisdiction", type = {CodeableConcept.class}, order=16, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=true)
6233    @Description(shortDefinition="Intended jurisdiction for plan definition (if applicable)", formalDefinition="A legal or geographic region in which the plan definition is intended to be used." )
6234    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/jurisdiction")
6235    protected List<CodeableConcept> jurisdiction;
6236
6237    /**
6238     * Explanation of why this plan definition is needed and why it has been designed as it has.
6239     */
6240    @Child(name = "purpose", type = {MarkdownType.class}, order=17, min=0, max=1, modifier=false, summary=false)
6241    @Description(shortDefinition="Why this plan definition is defined", formalDefinition="Explanation of why this plan definition is needed and why it has been designed as it has." )
6242    protected MarkdownType purpose;
6243
6244    /**
6245     * A detailed description of how the plan definition is used from a clinical perspective.
6246     */
6247    @Child(name = "usage", type = {MarkdownType.class}, order=18, min=0, max=1, modifier=false, summary=false)
6248    @Description(shortDefinition="Describes the clinical usage of the plan", formalDefinition="A detailed description of how the plan definition is used from a clinical perspective." )
6249    protected MarkdownType usage;
6250
6251    /**
6252     * A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.
6253     */
6254    @Child(name = "copyright", type = {MarkdownType.class}, order=19, min=0, max=1, modifier=false, summary=false)
6255    @Description(shortDefinition="Use and/or publishing restrictions", formalDefinition="A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition." )
6256    protected MarkdownType copyright;
6257
6258    /**
6259     * A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
6260     */
6261    @Child(name = "copyrightLabel", type = {StringType.class}, order=20, min=0, max=1, modifier=false, summary=false)
6262    @Description(shortDefinition="Copyright holder and year(s)", formalDefinition="A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved')." )
6263    protected StringType copyrightLabel;
6264
6265    /**
6266     * The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
6267     */
6268    @Child(name = "approvalDate", type = {DateType.class}, order=21, min=0, max=1, modifier=false, summary=false)
6269    @Description(shortDefinition="When the plan definition was approved by publisher", formalDefinition="The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage." )
6270    protected DateType approvalDate;
6271
6272    /**
6273     * The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
6274     */
6275    @Child(name = "lastReviewDate", type = {DateType.class}, order=22, min=0, max=1, modifier=false, summary=false)
6276    @Description(shortDefinition="When the plan definition was last reviewed by the publisher", formalDefinition="The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date." )
6277    protected DateType lastReviewDate;
6278
6279    /**
6280     * The period during which the plan definition content was or is planned to be in active use.
6281     */
6282    @Child(name = "effectivePeriod", type = {Period.class}, order=23, min=0, max=1, modifier=false, summary=true)
6283    @Description(shortDefinition="When the plan definition is expected to be used", formalDefinition="The period during which the plan definition content was or is planned to be in active use." )
6284    protected Period effectivePeriod;
6285
6286    /**
6287     * Descriptive topics related to the content of the plan definition. Topics provide a high-level categorization of the definition that can be useful for filtering and searching.
6288     */
6289    @Child(name = "topic", type = {CodeableConcept.class}, order=24, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6290    @Description(shortDefinition="E.g. Education, Treatment, Assessment", formalDefinition="Descriptive topics related to the content of the plan definition. Topics provide a high-level categorization of the definition that can be useful for filtering and searching." )
6291    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/definition-topic")
6292    protected List<CodeableConcept> topic;
6293
6294    /**
6295     * An individiual or organization primarily involved in the creation and maintenance of the content.
6296     */
6297    @Child(name = "author", type = {ContactDetail.class}, order=25, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6298    @Description(shortDefinition="Who authored the content", formalDefinition="An individiual or organization primarily involved in the creation and maintenance of the content." )
6299    protected List<ContactDetail> author;
6300
6301    /**
6302     * An individual or organization primarily responsible for internal coherence of the content.
6303     */
6304    @Child(name = "editor", type = {ContactDetail.class}, order=26, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6305    @Description(shortDefinition="Who edited the content", formalDefinition="An individual or organization primarily responsible for internal coherence of the content." )
6306    protected List<ContactDetail> editor;
6307
6308    /**
6309     * An individual or organization asserted by the publisher to be primarily responsible for review of some aspect of the content.
6310     */
6311    @Child(name = "reviewer", type = {ContactDetail.class}, order=27, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6312    @Description(shortDefinition="Who reviewed the content", formalDefinition="An individual or organization asserted by the publisher to be primarily responsible for review of some aspect of the content." )
6313    protected List<ContactDetail> reviewer;
6314
6315    /**
6316     * An individual or organization asserted by the publisher to be responsible for officially endorsing the content for use in some setting.
6317     */
6318    @Child(name = "endorser", type = {ContactDetail.class}, order=28, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6319    @Description(shortDefinition="Who endorsed the content", formalDefinition="An individual or organization asserted by the publisher to be responsible for officially endorsing the content for use in some setting." )
6320    protected List<ContactDetail> endorser;
6321
6322    /**
6323     * Related artifacts such as additional documentation, justification, or bibliographic references.
6324     */
6325    @Child(name = "relatedArtifact", type = {RelatedArtifact.class}, order=29, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6326    @Description(shortDefinition="Additional documentation, citations", formalDefinition="Related artifacts such as additional documentation, justification, or bibliographic references." )
6327    protected List<RelatedArtifact> relatedArtifact;
6328
6329    /**
6330     * A reference to a Library resource containing any formal logic used by the plan definition.
6331     */
6332    @Child(name = "library", type = {CanonicalType.class}, order=30, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6333    @Description(shortDefinition="Logic used by the plan definition", formalDefinition="A reference to a Library resource containing any formal logic used by the plan definition." )
6334    protected List<CanonicalType> library;
6335
6336    /**
6337     * A goal describes an expected outcome that activities within the plan are intended to achieve. For example, weight loss, restoring an activity of daily living, obtaining herd immunity via immunization, meeting a process improvement objective, meeting the acceptance criteria for a test as specified by a quality specification, etc.
6338     */
6339    @Child(name = "goal", type = {}, order=31, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6340    @Description(shortDefinition="What the plan is trying to accomplish", formalDefinition="A goal describes an expected outcome that activities within the plan are intended to achieve. For example, weight loss, restoring an activity of daily living, obtaining herd immunity via immunization, meeting a process improvement objective, meeting the acceptance criteria for a test as specified by a quality specification, etc." )
6341    protected List<PlanDefinitionGoalComponent> goal;
6342
6343    /**
6344     * Actors represent the individuals or groups involved in the execution of the defined set of activities.
6345     */
6346    @Child(name = "actor", type = {}, order=32, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6347    @Description(shortDefinition="Actors within the plan", formalDefinition="Actors represent the individuals or groups involved in the execution of the defined set of activities." )
6348    protected List<PlanDefinitionActorComponent> actor;
6349
6350    /**
6351     * An action or group of actions to be taken as part of the plan. For example, in clinical care, an action would be to prescribe a particular indicated medication, or perform a particular test as appropriate. In pharmaceutical quality, an action would be the test that needs to be performed on a drug product as defined in the quality specification.
6352     */
6353    @Child(name = "action", type = {}, order=33, min=0, max=Child.MAX_UNLIMITED, modifier=false, summary=false)
6354    @Description(shortDefinition="Action defined by the plan", formalDefinition="An action or group of actions to be taken as part of the plan. For example, in clinical care, an action would be to prescribe a particular indicated medication, or perform a particular test as appropriate. In pharmaceutical quality, an action would be the test that needs to be performed on a drug product as defined in the quality specification." )
6355    protected List<PlanDefinitionActionComponent> action;
6356
6357    /**
6358     * If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example "pain", "on flare-up", etc.
6359     */
6360    @Child(name = "asNeeded", type = {BooleanType.class, CodeableConcept.class}, order=34, min=0, max=1, modifier=false, summary=true)
6361    @Description(shortDefinition="Preconditions for service", formalDefinition="If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc." )
6362    @ca.uhn.fhir.model.api.annotation.Binding(valueSet="http://hl7.org/fhir/ValueSet/medication-as-needed-reason")
6363    protected DataType asNeeded;
6364
6365    private static final long serialVersionUID = 324754414L;
6366
6367  /**
6368   * Constructor
6369   */
6370    public PlanDefinition() {
6371      super();
6372    }
6373
6374  /**
6375   * Constructor
6376   */
6377    public PlanDefinition(PublicationStatus status) {
6378      super();
6379      this.setStatus(status);
6380    }
6381
6382    /**
6383     * @return {@link #url} (An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
6384     */
6385    public UriType getUrlElement() { 
6386      if (this.url == null)
6387        if (Configuration.errorOnAutoCreate())
6388          throw new Error("Attempt to auto-create PlanDefinition.url");
6389        else if (Configuration.doAutoCreate())
6390          this.url = new UriType(); // bb
6391      return this.url;
6392    }
6393
6394    public boolean hasUrlElement() { 
6395      return this.url != null && !this.url.isEmpty();
6396    }
6397
6398    public boolean hasUrl() { 
6399      return this.url != null && !this.url.isEmpty();
6400    }
6401
6402    /**
6403     * @param value {@link #url} (An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.). This is the underlying object with id, value and extensions. The accessor "getUrl" gives direct access to the value
6404     */
6405    public PlanDefinition setUrlElement(UriType value) { 
6406      this.url = value;
6407      return this;
6408    }
6409
6410    /**
6411     * @return An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.
6412     */
6413    public String getUrl() { 
6414      return this.url == null ? null : this.url.getValue();
6415    }
6416
6417    /**
6418     * @param value An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.
6419     */
6420    public PlanDefinition setUrl(String value) { 
6421      if (Utilities.noString(value))
6422        this.url = null;
6423      else {
6424        if (this.url == null)
6425          this.url = new UriType();
6426        this.url.setValue(value);
6427      }
6428      return this;
6429    }
6430
6431    /**
6432     * @return {@link #identifier} (A formal identifier that is used to identify this plan definition when it is represented in other formats, or referenced in a specification, model, design or an instance.)
6433     */
6434    public List<Identifier> getIdentifier() { 
6435      if (this.identifier == null)
6436        this.identifier = new ArrayList<Identifier>();
6437      return this.identifier;
6438    }
6439
6440    /**
6441     * @return Returns a reference to <code>this</code> for easy method chaining
6442     */
6443    public PlanDefinition setIdentifier(List<Identifier> theIdentifier) { 
6444      this.identifier = theIdentifier;
6445      return this;
6446    }
6447
6448    public boolean hasIdentifier() { 
6449      if (this.identifier == null)
6450        return false;
6451      for (Identifier item : this.identifier)
6452        if (!item.isEmpty())
6453          return true;
6454      return false;
6455    }
6456
6457    public Identifier addIdentifier() { //3
6458      Identifier t = new Identifier();
6459      if (this.identifier == null)
6460        this.identifier = new ArrayList<Identifier>();
6461      this.identifier.add(t);
6462      return t;
6463    }
6464
6465    public PlanDefinition addIdentifier(Identifier t) { //3
6466      if (t == null)
6467        return this;
6468      if (this.identifier == null)
6469        this.identifier = new ArrayList<Identifier>();
6470      this.identifier.add(t);
6471      return this;
6472    }
6473
6474    /**
6475     * @return The first repetition of repeating field {@link #identifier}, creating it if it does not already exist {3}
6476     */
6477    public Identifier getIdentifierFirstRep() { 
6478      if (getIdentifier().isEmpty()) {
6479        addIdentifier();
6480      }
6481      return getIdentifier().get(0);
6482    }
6483
6484    /**
6485     * @return {@link #version} (The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
6486     */
6487    public StringType getVersionElement() { 
6488      if (this.version == null)
6489        if (Configuration.errorOnAutoCreate())
6490          throw new Error("Attempt to auto-create PlanDefinition.version");
6491        else if (Configuration.doAutoCreate())
6492          this.version = new StringType(); // bb
6493      return this.version;
6494    }
6495
6496    public boolean hasVersionElement() { 
6497      return this.version != null && !this.version.isEmpty();
6498    }
6499
6500    public boolean hasVersion() { 
6501      return this.version != null && !this.version.isEmpty();
6502    }
6503
6504    /**
6505     * @param value {@link #version} (The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.). This is the underlying object with id, value and extensions. The accessor "getVersion" gives direct access to the value
6506     */
6507    public PlanDefinition setVersionElement(StringType value) { 
6508      this.version = value;
6509      return this;
6510    }
6511
6512    /**
6513     * @return The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.
6514     */
6515    public String getVersion() { 
6516      return this.version == null ? null : this.version.getValue();
6517    }
6518
6519    /**
6520     * @param value The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.
6521     */
6522    public PlanDefinition setVersion(String value) { 
6523      if (Utilities.noString(value))
6524        this.version = null;
6525      else {
6526        if (this.version == null)
6527          this.version = new StringType();
6528        this.version.setValue(value);
6529      }
6530      return this;
6531    }
6532
6533    /**
6534     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
6535     */
6536    public DataType getVersionAlgorithm() { 
6537      return this.versionAlgorithm;
6538    }
6539
6540    /**
6541     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
6542     */
6543    public StringType getVersionAlgorithmStringType() throws FHIRException { 
6544      if (this.versionAlgorithm == null)
6545        this.versionAlgorithm = new StringType();
6546      if (!(this.versionAlgorithm instanceof StringType))
6547        throw new FHIRException("Type mismatch: the type StringType was expected, but "+this.versionAlgorithm.getClass().getName()+" was encountered");
6548      return (StringType) this.versionAlgorithm;
6549    }
6550
6551    public boolean hasVersionAlgorithmStringType() { 
6552      return this != null && this.versionAlgorithm instanceof StringType;
6553    }
6554
6555    /**
6556     * @return {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
6557     */
6558    public Coding getVersionAlgorithmCoding() throws FHIRException { 
6559      if (this.versionAlgorithm == null)
6560        this.versionAlgorithm = new Coding();
6561      if (!(this.versionAlgorithm instanceof Coding))
6562        throw new FHIRException("Type mismatch: the type Coding was expected, but "+this.versionAlgorithm.getClass().getName()+" was encountered");
6563      return (Coding) this.versionAlgorithm;
6564    }
6565
6566    public boolean hasVersionAlgorithmCoding() { 
6567      return this != null && this.versionAlgorithm instanceof Coding;
6568    }
6569
6570    public boolean hasVersionAlgorithm() { 
6571      return this.versionAlgorithm != null && !this.versionAlgorithm.isEmpty();
6572    }
6573
6574    /**
6575     * @param value {@link #versionAlgorithm} (Indicates the mechanism used to compare versions to determine which is more current.)
6576     */
6577    public PlanDefinition setVersionAlgorithm(DataType value) { 
6578      if (value != null && !(value instanceof StringType || value instanceof Coding))
6579        throw new FHIRException("Not the right type for PlanDefinition.versionAlgorithm[x]: "+value.fhirType());
6580      this.versionAlgorithm = value;
6581      return this;
6582    }
6583
6584    /**
6585     * @return {@link #name} (A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
6586     */
6587    public StringType getNameElement() { 
6588      if (this.name == null)
6589        if (Configuration.errorOnAutoCreate())
6590          throw new Error("Attempt to auto-create PlanDefinition.name");
6591        else if (Configuration.doAutoCreate())
6592          this.name = new StringType(); // bb
6593      return this.name;
6594    }
6595
6596    public boolean hasNameElement() { 
6597      return this.name != null && !this.name.isEmpty();
6598    }
6599
6600    public boolean hasName() { 
6601      return this.name != null && !this.name.isEmpty();
6602    }
6603
6604    /**
6605     * @param value {@link #name} (A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.). This is the underlying object with id, value and extensions. The accessor "getName" gives direct access to the value
6606     */
6607    public PlanDefinition setNameElement(StringType value) { 
6608      this.name = value;
6609      return this;
6610    }
6611
6612    /**
6613     * @return A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.
6614     */
6615    public String getName() { 
6616      return this.name == null ? null : this.name.getValue();
6617    }
6618
6619    /**
6620     * @param value A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.
6621     */
6622    public PlanDefinition setName(String value) { 
6623      if (Utilities.noString(value))
6624        this.name = null;
6625      else {
6626        if (this.name == null)
6627          this.name = new StringType();
6628        this.name.setValue(value);
6629      }
6630      return this;
6631    }
6632
6633    /**
6634     * @return {@link #title} (A short, descriptive, user-friendly title for the plan definition.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
6635     */
6636    public StringType getTitleElement() { 
6637      if (this.title == null)
6638        if (Configuration.errorOnAutoCreate())
6639          throw new Error("Attempt to auto-create PlanDefinition.title");
6640        else if (Configuration.doAutoCreate())
6641          this.title = new StringType(); // bb
6642      return this.title;
6643    }
6644
6645    public boolean hasTitleElement() { 
6646      return this.title != null && !this.title.isEmpty();
6647    }
6648
6649    public boolean hasTitle() { 
6650      return this.title != null && !this.title.isEmpty();
6651    }
6652
6653    /**
6654     * @param value {@link #title} (A short, descriptive, user-friendly title for the plan definition.). This is the underlying object with id, value and extensions. The accessor "getTitle" gives direct access to the value
6655     */
6656    public PlanDefinition setTitleElement(StringType value) { 
6657      this.title = value;
6658      return this;
6659    }
6660
6661    /**
6662     * @return A short, descriptive, user-friendly title for the plan definition.
6663     */
6664    public String getTitle() { 
6665      return this.title == null ? null : this.title.getValue();
6666    }
6667
6668    /**
6669     * @param value A short, descriptive, user-friendly title for the plan definition.
6670     */
6671    public PlanDefinition setTitle(String value) { 
6672      if (Utilities.noString(value))
6673        this.title = null;
6674      else {
6675        if (this.title == null)
6676          this.title = new StringType();
6677        this.title.setValue(value);
6678      }
6679      return this;
6680    }
6681
6682    /**
6683     * @return {@link #subtitle} (An explanatory or alternate title for the plan definition giving additional information about its content.). This is the underlying object with id, value and extensions. The accessor "getSubtitle" gives direct access to the value
6684     */
6685    public StringType getSubtitleElement() { 
6686      if (this.subtitle == null)
6687        if (Configuration.errorOnAutoCreate())
6688          throw new Error("Attempt to auto-create PlanDefinition.subtitle");
6689        else if (Configuration.doAutoCreate())
6690          this.subtitle = new StringType(); // bb
6691      return this.subtitle;
6692    }
6693
6694    public boolean hasSubtitleElement() { 
6695      return this.subtitle != null && !this.subtitle.isEmpty();
6696    }
6697
6698    public boolean hasSubtitle() { 
6699      return this.subtitle != null && !this.subtitle.isEmpty();
6700    }
6701
6702    /**
6703     * @param value {@link #subtitle} (An explanatory or alternate title for the plan definition giving additional information about its content.). This is the underlying object with id, value and extensions. The accessor "getSubtitle" gives direct access to the value
6704     */
6705    public PlanDefinition setSubtitleElement(StringType value) { 
6706      this.subtitle = value;
6707      return this;
6708    }
6709
6710    /**
6711     * @return An explanatory or alternate title for the plan definition giving additional information about its content.
6712     */
6713    public String getSubtitle() { 
6714      return this.subtitle == null ? null : this.subtitle.getValue();
6715    }
6716
6717    /**
6718     * @param value An explanatory or alternate title for the plan definition giving additional information about its content.
6719     */
6720    public PlanDefinition setSubtitle(String value) { 
6721      if (Utilities.noString(value))
6722        this.subtitle = null;
6723      else {
6724        if (this.subtitle == null)
6725          this.subtitle = new StringType();
6726        this.subtitle.setValue(value);
6727      }
6728      return this;
6729    }
6730
6731    /**
6732     * @return {@link #type} (A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition.)
6733     */
6734    public CodeableConcept getType() { 
6735      if (this.type == null)
6736        if (Configuration.errorOnAutoCreate())
6737          throw new Error("Attempt to auto-create PlanDefinition.type");
6738        else if (Configuration.doAutoCreate())
6739          this.type = new CodeableConcept(); // cc
6740      return this.type;
6741    }
6742
6743    public boolean hasType() { 
6744      return this.type != null && !this.type.isEmpty();
6745    }
6746
6747    /**
6748     * @param value {@link #type} (A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition.)
6749     */
6750    public PlanDefinition setType(CodeableConcept value) { 
6751      this.type = value;
6752      return this;
6753    }
6754
6755    /**
6756     * @return {@link #status} (The status of this plan definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
6757     */
6758    public Enumeration<PublicationStatus> getStatusElement() { 
6759      if (this.status == null)
6760        if (Configuration.errorOnAutoCreate())
6761          throw new Error("Attempt to auto-create PlanDefinition.status");
6762        else if (Configuration.doAutoCreate())
6763          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory()); // bb
6764      return this.status;
6765    }
6766
6767    public boolean hasStatusElement() { 
6768      return this.status != null && !this.status.isEmpty();
6769    }
6770
6771    public boolean hasStatus() { 
6772      return this.status != null && !this.status.isEmpty();
6773    }
6774
6775    /**
6776     * @param value {@link #status} (The status of this plan definition. Enables tracking the life-cycle of the content.). This is the underlying object with id, value and extensions. The accessor "getStatus" gives direct access to the value
6777     */
6778    public PlanDefinition setStatusElement(Enumeration<PublicationStatus> value) { 
6779      this.status = value;
6780      return this;
6781    }
6782
6783    /**
6784     * @return The status of this plan definition. Enables tracking the life-cycle of the content.
6785     */
6786    public PublicationStatus getStatus() { 
6787      return this.status == null ? null : this.status.getValue();
6788    }
6789
6790    /**
6791     * @param value The status of this plan definition. Enables tracking the life-cycle of the content.
6792     */
6793    public PlanDefinition setStatus(PublicationStatus value) { 
6794        if (this.status == null)
6795          this.status = new Enumeration<PublicationStatus>(new PublicationStatusEnumFactory());
6796        this.status.setValue(value);
6797      return this;
6798    }
6799
6800    /**
6801     * @return {@link #experimental} (A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
6802     */
6803    public BooleanType getExperimentalElement() { 
6804      if (this.experimental == null)
6805        if (Configuration.errorOnAutoCreate())
6806          throw new Error("Attempt to auto-create PlanDefinition.experimental");
6807        else if (Configuration.doAutoCreate())
6808          this.experimental = new BooleanType(); // bb
6809      return this.experimental;
6810    }
6811
6812    public boolean hasExperimentalElement() { 
6813      return this.experimental != null && !this.experimental.isEmpty();
6814    }
6815
6816    public boolean hasExperimental() { 
6817      return this.experimental != null && !this.experimental.isEmpty();
6818    }
6819
6820    /**
6821     * @param value {@link #experimental} (A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.). This is the underlying object with id, value and extensions. The accessor "getExperimental" gives direct access to the value
6822     */
6823    public PlanDefinition setExperimentalElement(BooleanType value) { 
6824      this.experimental = value;
6825      return this;
6826    }
6827
6828    /**
6829     * @return A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
6830     */
6831    public boolean getExperimental() { 
6832      return this.experimental == null || this.experimental.isEmpty() ? false : this.experimental.getValue();
6833    }
6834
6835    /**
6836     * @param value A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.
6837     */
6838    public PlanDefinition setExperimental(boolean value) { 
6839        if (this.experimental == null)
6840          this.experimental = new BooleanType();
6841        this.experimental.setValue(value);
6842      return this;
6843    }
6844
6845    /**
6846     * @return {@link #subject} (A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
6847     */
6848    public DataType getSubject() { 
6849      return this.subject;
6850    }
6851
6852    /**
6853     * @return {@link #subject} (A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
6854     */
6855    public CodeableConcept getSubjectCodeableConcept() throws FHIRException { 
6856      if (this.subject == null)
6857        this.subject = new CodeableConcept();
6858      if (!(this.subject instanceof CodeableConcept))
6859        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.subject.getClass().getName()+" was encountered");
6860      return (CodeableConcept) this.subject;
6861    }
6862
6863    public boolean hasSubjectCodeableConcept() { 
6864      return this != null && this.subject instanceof CodeableConcept;
6865    }
6866
6867    /**
6868     * @return {@link #subject} (A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
6869     */
6870    public Reference getSubjectReference() throws FHIRException { 
6871      if (this.subject == null)
6872        this.subject = new Reference();
6873      if (!(this.subject instanceof Reference))
6874        throw new FHIRException("Type mismatch: the type Reference was expected, but "+this.subject.getClass().getName()+" was encountered");
6875      return (Reference) this.subject;
6876    }
6877
6878    public boolean hasSubjectReference() { 
6879      return this != null && this.subject instanceof Reference;
6880    }
6881
6882    /**
6883     * @return {@link #subject} (A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
6884     */
6885    public CanonicalType getSubjectCanonicalType() throws FHIRException { 
6886      if (this.subject == null)
6887        this.subject = new CanonicalType();
6888      if (!(this.subject instanceof CanonicalType))
6889        throw new FHIRException("Type mismatch: the type CanonicalType was expected, but "+this.subject.getClass().getName()+" was encountered");
6890      return (CanonicalType) this.subject;
6891    }
6892
6893    public boolean hasSubjectCanonicalType() { 
6894      return this != null && this.subject instanceof CanonicalType;
6895    }
6896
6897    public boolean hasSubject() { 
6898      return this.subject != null && !this.subject.isEmpty();
6899    }
6900
6901    /**
6902     * @param value {@link #subject} (A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.)
6903     */
6904    public PlanDefinition setSubject(DataType value) { 
6905      if (value != null && !(value instanceof CodeableConcept || value instanceof Reference || value instanceof CanonicalType))
6906        throw new FHIRException("Not the right type for PlanDefinition.subject[x]: "+value.fhirType());
6907      this.subject = value;
6908      return this;
6909    }
6910
6911    /**
6912     * @return {@link #date} (The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
6913     */
6914    public DateTimeType getDateElement() { 
6915      if (this.date == null)
6916        if (Configuration.errorOnAutoCreate())
6917          throw new Error("Attempt to auto-create PlanDefinition.date");
6918        else if (Configuration.doAutoCreate())
6919          this.date = new DateTimeType(); // bb
6920      return this.date;
6921    }
6922
6923    public boolean hasDateElement() { 
6924      return this.date != null && !this.date.isEmpty();
6925    }
6926
6927    public boolean hasDate() { 
6928      return this.date != null && !this.date.isEmpty();
6929    }
6930
6931    /**
6932     * @param value {@link #date} (The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.). This is the underlying object with id, value and extensions. The accessor "getDate" gives direct access to the value
6933     */
6934    public PlanDefinition setDateElement(DateTimeType value) { 
6935      this.date = value;
6936      return this;
6937    }
6938
6939    /**
6940     * @return The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.
6941     */
6942    public Date getDate() { 
6943      return this.date == null ? null : this.date.getValue();
6944    }
6945
6946    /**
6947     * @param value The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.
6948     */
6949    public PlanDefinition setDate(Date value) { 
6950      if (value == null)
6951        this.date = null;
6952      else {
6953        if (this.date == null)
6954          this.date = new DateTimeType();
6955        this.date.setValue(value);
6956      }
6957      return this;
6958    }
6959
6960    /**
6961     * @return {@link #publisher} (The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
6962     */
6963    public StringType getPublisherElement() { 
6964      if (this.publisher == null)
6965        if (Configuration.errorOnAutoCreate())
6966          throw new Error("Attempt to auto-create PlanDefinition.publisher");
6967        else if (Configuration.doAutoCreate())
6968          this.publisher = new StringType(); // bb
6969      return this.publisher;
6970    }
6971
6972    public boolean hasPublisherElement() { 
6973      return this.publisher != null && !this.publisher.isEmpty();
6974    }
6975
6976    public boolean hasPublisher() { 
6977      return this.publisher != null && !this.publisher.isEmpty();
6978    }
6979
6980    /**
6981     * @param value {@link #publisher} (The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getPublisher" gives direct access to the value
6982     */
6983    public PlanDefinition setPublisherElement(StringType value) { 
6984      this.publisher = value;
6985      return this;
6986    }
6987
6988    /**
6989     * @return The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.
6990     */
6991    public String getPublisher() { 
6992      return this.publisher == null ? null : this.publisher.getValue();
6993    }
6994
6995    /**
6996     * @param value The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.
6997     */
6998    public PlanDefinition setPublisher(String value) { 
6999      if (Utilities.noString(value))
7000        this.publisher = null;
7001      else {
7002        if (this.publisher == null)
7003          this.publisher = new StringType();
7004        this.publisher.setValue(value);
7005      }
7006      return this;
7007    }
7008
7009    /**
7010     * @return {@link #contact} (Contact details to assist a user in finding and communicating with the publisher.)
7011     */
7012    public List<ContactDetail> getContact() { 
7013      if (this.contact == null)
7014        this.contact = new ArrayList<ContactDetail>();
7015      return this.contact;
7016    }
7017
7018    /**
7019     * @return Returns a reference to <code>this</code> for easy method chaining
7020     */
7021    public PlanDefinition setContact(List<ContactDetail> theContact) { 
7022      this.contact = theContact;
7023      return this;
7024    }
7025
7026    public boolean hasContact() { 
7027      if (this.contact == null)
7028        return false;
7029      for (ContactDetail item : this.contact)
7030        if (!item.isEmpty())
7031          return true;
7032      return false;
7033    }
7034
7035    public ContactDetail addContact() { //3
7036      ContactDetail t = new ContactDetail();
7037      if (this.contact == null)
7038        this.contact = new ArrayList<ContactDetail>();
7039      this.contact.add(t);
7040      return t;
7041    }
7042
7043    public PlanDefinition addContact(ContactDetail t) { //3
7044      if (t == null)
7045        return this;
7046      if (this.contact == null)
7047        this.contact = new ArrayList<ContactDetail>();
7048      this.contact.add(t);
7049      return this;
7050    }
7051
7052    /**
7053     * @return The first repetition of repeating field {@link #contact}, creating it if it does not already exist {3}
7054     */
7055    public ContactDetail getContactFirstRep() { 
7056      if (getContact().isEmpty()) {
7057        addContact();
7058      }
7059      return getContact().get(0);
7060    }
7061
7062    /**
7063     * @return {@link #description} (A free text natural language description of the plan definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
7064     */
7065    public MarkdownType getDescriptionElement() { 
7066      if (this.description == null)
7067        if (Configuration.errorOnAutoCreate())
7068          throw new Error("Attempt to auto-create PlanDefinition.description");
7069        else if (Configuration.doAutoCreate())
7070          this.description = new MarkdownType(); // bb
7071      return this.description;
7072    }
7073
7074    public boolean hasDescriptionElement() { 
7075      return this.description != null && !this.description.isEmpty();
7076    }
7077
7078    public boolean hasDescription() { 
7079      return this.description != null && !this.description.isEmpty();
7080    }
7081
7082    /**
7083     * @param value {@link #description} (A free text natural language description of the plan definition from a consumer's perspective.). This is the underlying object with id, value and extensions. The accessor "getDescription" gives direct access to the value
7084     */
7085    public PlanDefinition setDescriptionElement(MarkdownType value) { 
7086      this.description = value;
7087      return this;
7088    }
7089
7090    /**
7091     * @return A free text natural language description of the plan definition from a consumer's perspective.
7092     */
7093    public String getDescription() { 
7094      return this.description == null ? null : this.description.getValue();
7095    }
7096
7097    /**
7098     * @param value A free text natural language description of the plan definition from a consumer's perspective.
7099     */
7100    public PlanDefinition setDescription(String value) { 
7101      if (Utilities.noString(value))
7102        this.description = null;
7103      else {
7104        if (this.description == null)
7105          this.description = new MarkdownType();
7106        this.description.setValue(value);
7107      }
7108      return this;
7109    }
7110
7111    /**
7112     * @return {@link #useContext} (The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate plan definition instances.)
7113     */
7114    public List<UsageContext> getUseContext() { 
7115      if (this.useContext == null)
7116        this.useContext = new ArrayList<UsageContext>();
7117      return this.useContext;
7118    }
7119
7120    /**
7121     * @return Returns a reference to <code>this</code> for easy method chaining
7122     */
7123    public PlanDefinition setUseContext(List<UsageContext> theUseContext) { 
7124      this.useContext = theUseContext;
7125      return this;
7126    }
7127
7128    public boolean hasUseContext() { 
7129      if (this.useContext == null)
7130        return false;
7131      for (UsageContext item : this.useContext)
7132        if (!item.isEmpty())
7133          return true;
7134      return false;
7135    }
7136
7137    public UsageContext addUseContext() { //3
7138      UsageContext t = new UsageContext();
7139      if (this.useContext == null)
7140        this.useContext = new ArrayList<UsageContext>();
7141      this.useContext.add(t);
7142      return t;
7143    }
7144
7145    public PlanDefinition addUseContext(UsageContext t) { //3
7146      if (t == null)
7147        return this;
7148      if (this.useContext == null)
7149        this.useContext = new ArrayList<UsageContext>();
7150      this.useContext.add(t);
7151      return this;
7152    }
7153
7154    /**
7155     * @return The first repetition of repeating field {@link #useContext}, creating it if it does not already exist {3}
7156     */
7157    public UsageContext getUseContextFirstRep() { 
7158      if (getUseContext().isEmpty()) {
7159        addUseContext();
7160      }
7161      return getUseContext().get(0);
7162    }
7163
7164    /**
7165     * @return {@link #jurisdiction} (A legal or geographic region in which the plan definition is intended to be used.)
7166     */
7167    public List<CodeableConcept> getJurisdiction() { 
7168      if (this.jurisdiction == null)
7169        this.jurisdiction = new ArrayList<CodeableConcept>();
7170      return this.jurisdiction;
7171    }
7172
7173    /**
7174     * @return Returns a reference to <code>this</code> for easy method chaining
7175     */
7176    public PlanDefinition setJurisdiction(List<CodeableConcept> theJurisdiction) { 
7177      this.jurisdiction = theJurisdiction;
7178      return this;
7179    }
7180
7181    public boolean hasJurisdiction() { 
7182      if (this.jurisdiction == null)
7183        return false;
7184      for (CodeableConcept item : this.jurisdiction)
7185        if (!item.isEmpty())
7186          return true;
7187      return false;
7188    }
7189
7190    public CodeableConcept addJurisdiction() { //3
7191      CodeableConcept t = new CodeableConcept();
7192      if (this.jurisdiction == null)
7193        this.jurisdiction = new ArrayList<CodeableConcept>();
7194      this.jurisdiction.add(t);
7195      return t;
7196    }
7197
7198    public PlanDefinition addJurisdiction(CodeableConcept t) { //3
7199      if (t == null)
7200        return this;
7201      if (this.jurisdiction == null)
7202        this.jurisdiction = new ArrayList<CodeableConcept>();
7203      this.jurisdiction.add(t);
7204      return this;
7205    }
7206
7207    /**
7208     * @return The first repetition of repeating field {@link #jurisdiction}, creating it if it does not already exist {3}
7209     */
7210    public CodeableConcept getJurisdictionFirstRep() { 
7211      if (getJurisdiction().isEmpty()) {
7212        addJurisdiction();
7213      }
7214      return getJurisdiction().get(0);
7215    }
7216
7217    /**
7218     * @return {@link #purpose} (Explanation of why this plan definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
7219     */
7220    public MarkdownType getPurposeElement() { 
7221      if (this.purpose == null)
7222        if (Configuration.errorOnAutoCreate())
7223          throw new Error("Attempt to auto-create PlanDefinition.purpose");
7224        else if (Configuration.doAutoCreate())
7225          this.purpose = new MarkdownType(); // bb
7226      return this.purpose;
7227    }
7228
7229    public boolean hasPurposeElement() { 
7230      return this.purpose != null && !this.purpose.isEmpty();
7231    }
7232
7233    public boolean hasPurpose() { 
7234      return this.purpose != null && !this.purpose.isEmpty();
7235    }
7236
7237    /**
7238     * @param value {@link #purpose} (Explanation of why this plan definition is needed and why it has been designed as it has.). This is the underlying object with id, value and extensions. The accessor "getPurpose" gives direct access to the value
7239     */
7240    public PlanDefinition setPurposeElement(MarkdownType value) { 
7241      this.purpose = value;
7242      return this;
7243    }
7244
7245    /**
7246     * @return Explanation of why this plan definition is needed and why it has been designed as it has.
7247     */
7248    public String getPurpose() { 
7249      return this.purpose == null ? null : this.purpose.getValue();
7250    }
7251
7252    /**
7253     * @param value Explanation of why this plan definition is needed and why it has been designed as it has.
7254     */
7255    public PlanDefinition setPurpose(String value) { 
7256      if (Utilities.noString(value))
7257        this.purpose = null;
7258      else {
7259        if (this.purpose == null)
7260          this.purpose = new MarkdownType();
7261        this.purpose.setValue(value);
7262      }
7263      return this;
7264    }
7265
7266    /**
7267     * @return {@link #usage} (A detailed description of how the plan definition is used from a clinical perspective.). This is the underlying object with id, value and extensions. The accessor "getUsage" gives direct access to the value
7268     */
7269    public MarkdownType getUsageElement() { 
7270      if (this.usage == null)
7271        if (Configuration.errorOnAutoCreate())
7272          throw new Error("Attempt to auto-create PlanDefinition.usage");
7273        else if (Configuration.doAutoCreate())
7274          this.usage = new MarkdownType(); // bb
7275      return this.usage;
7276    }
7277
7278    public boolean hasUsageElement() { 
7279      return this.usage != null && !this.usage.isEmpty();
7280    }
7281
7282    public boolean hasUsage() { 
7283      return this.usage != null && !this.usage.isEmpty();
7284    }
7285
7286    /**
7287     * @param value {@link #usage} (A detailed description of how the plan definition is used from a clinical perspective.). This is the underlying object with id, value and extensions. The accessor "getUsage" gives direct access to the value
7288     */
7289    public PlanDefinition setUsageElement(MarkdownType value) { 
7290      this.usage = value;
7291      return this;
7292    }
7293
7294    /**
7295     * @return A detailed description of how the plan definition is used from a clinical perspective.
7296     */
7297    public String getUsage() { 
7298      return this.usage == null ? null : this.usage.getValue();
7299    }
7300
7301    /**
7302     * @param value A detailed description of how the plan definition is used from a clinical perspective.
7303     */
7304    public PlanDefinition setUsage(String value) { 
7305      if (Utilities.noString(value))
7306        this.usage = null;
7307      else {
7308        if (this.usage == null)
7309          this.usage = new MarkdownType();
7310        this.usage.setValue(value);
7311      }
7312      return this;
7313    }
7314
7315    /**
7316     * @return {@link #copyright} (A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
7317     */
7318    public MarkdownType getCopyrightElement() { 
7319      if (this.copyright == null)
7320        if (Configuration.errorOnAutoCreate())
7321          throw new Error("Attempt to auto-create PlanDefinition.copyright");
7322        else if (Configuration.doAutoCreate())
7323          this.copyright = new MarkdownType(); // bb
7324      return this.copyright;
7325    }
7326
7327    public boolean hasCopyrightElement() { 
7328      return this.copyright != null && !this.copyright.isEmpty();
7329    }
7330
7331    public boolean hasCopyright() { 
7332      return this.copyright != null && !this.copyright.isEmpty();
7333    }
7334
7335    /**
7336     * @param value {@link #copyright} (A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.). This is the underlying object with id, value and extensions. The accessor "getCopyright" gives direct access to the value
7337     */
7338    public PlanDefinition setCopyrightElement(MarkdownType value) { 
7339      this.copyright = value;
7340      return this;
7341    }
7342
7343    /**
7344     * @return A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.
7345     */
7346    public String getCopyright() { 
7347      return this.copyright == null ? null : this.copyright.getValue();
7348    }
7349
7350    /**
7351     * @param value A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.
7352     */
7353    public PlanDefinition setCopyright(String value) { 
7354      if (Utilities.noString(value))
7355        this.copyright = null;
7356      else {
7357        if (this.copyright == null)
7358          this.copyright = new MarkdownType();
7359        this.copyright.setValue(value);
7360      }
7361      return this;
7362    }
7363
7364    /**
7365     * @return {@link #copyrightLabel} (A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').). This is the underlying object with id, value and extensions. The accessor "getCopyrightLabel" gives direct access to the value
7366     */
7367    public StringType getCopyrightLabelElement() { 
7368      if (this.copyrightLabel == null)
7369        if (Configuration.errorOnAutoCreate())
7370          throw new Error("Attempt to auto-create PlanDefinition.copyrightLabel");
7371        else if (Configuration.doAutoCreate())
7372          this.copyrightLabel = new StringType(); // bb
7373      return this.copyrightLabel;
7374    }
7375
7376    public boolean hasCopyrightLabelElement() { 
7377      return this.copyrightLabel != null && !this.copyrightLabel.isEmpty();
7378    }
7379
7380    public boolean hasCopyrightLabel() { 
7381      return this.copyrightLabel != null && !this.copyrightLabel.isEmpty();
7382    }
7383
7384    /**
7385     * @param value {@link #copyrightLabel} (A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').). This is the underlying object with id, value and extensions. The accessor "getCopyrightLabel" gives direct access to the value
7386     */
7387    public PlanDefinition setCopyrightLabelElement(StringType value) { 
7388      this.copyrightLabel = value;
7389      return this;
7390    }
7391
7392    /**
7393     * @return A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
7394     */
7395    public String getCopyrightLabel() { 
7396      return this.copyrightLabel == null ? null : this.copyrightLabel.getValue();
7397    }
7398
7399    /**
7400     * @param value A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').
7401     */
7402    public PlanDefinition setCopyrightLabel(String value) { 
7403      if (Utilities.noString(value))
7404        this.copyrightLabel = null;
7405      else {
7406        if (this.copyrightLabel == null)
7407          this.copyrightLabel = new StringType();
7408        this.copyrightLabel.setValue(value);
7409      }
7410      return this;
7411    }
7412
7413    /**
7414     * @return {@link #approvalDate} (The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.). This is the underlying object with id, value and extensions. The accessor "getApprovalDate" gives direct access to the value
7415     */
7416    public DateType getApprovalDateElement() { 
7417      if (this.approvalDate == null)
7418        if (Configuration.errorOnAutoCreate())
7419          throw new Error("Attempt to auto-create PlanDefinition.approvalDate");
7420        else if (Configuration.doAutoCreate())
7421          this.approvalDate = new DateType(); // bb
7422      return this.approvalDate;
7423    }
7424
7425    public boolean hasApprovalDateElement() { 
7426      return this.approvalDate != null && !this.approvalDate.isEmpty();
7427    }
7428
7429    public boolean hasApprovalDate() { 
7430      return this.approvalDate != null && !this.approvalDate.isEmpty();
7431    }
7432
7433    /**
7434     * @param value {@link #approvalDate} (The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.). This is the underlying object with id, value and extensions. The accessor "getApprovalDate" gives direct access to the value
7435     */
7436    public PlanDefinition setApprovalDateElement(DateType value) { 
7437      this.approvalDate = value;
7438      return this;
7439    }
7440
7441    /**
7442     * @return The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
7443     */
7444    public Date getApprovalDate() { 
7445      return this.approvalDate == null ? null : this.approvalDate.getValue();
7446    }
7447
7448    /**
7449     * @param value The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.
7450     */
7451    public PlanDefinition setApprovalDate(Date value) { 
7452      if (value == null)
7453        this.approvalDate = null;
7454      else {
7455        if (this.approvalDate == null)
7456          this.approvalDate = new DateType();
7457        this.approvalDate.setValue(value);
7458      }
7459      return this;
7460    }
7461
7462    /**
7463     * @return {@link #lastReviewDate} (The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.). This is the underlying object with id, value and extensions. The accessor "getLastReviewDate" gives direct access to the value
7464     */
7465    public DateType getLastReviewDateElement() { 
7466      if (this.lastReviewDate == null)
7467        if (Configuration.errorOnAutoCreate())
7468          throw new Error("Attempt to auto-create PlanDefinition.lastReviewDate");
7469        else if (Configuration.doAutoCreate())
7470          this.lastReviewDate = new DateType(); // bb
7471      return this.lastReviewDate;
7472    }
7473
7474    public boolean hasLastReviewDateElement() { 
7475      return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
7476    }
7477
7478    public boolean hasLastReviewDate() { 
7479      return this.lastReviewDate != null && !this.lastReviewDate.isEmpty();
7480    }
7481
7482    /**
7483     * @param value {@link #lastReviewDate} (The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.). This is the underlying object with id, value and extensions. The accessor "getLastReviewDate" gives direct access to the value
7484     */
7485    public PlanDefinition setLastReviewDateElement(DateType value) { 
7486      this.lastReviewDate = value;
7487      return this;
7488    }
7489
7490    /**
7491     * @return The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
7492     */
7493    public Date getLastReviewDate() { 
7494      return this.lastReviewDate == null ? null : this.lastReviewDate.getValue();
7495    }
7496
7497    /**
7498     * @param value The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.
7499     */
7500    public PlanDefinition setLastReviewDate(Date value) { 
7501      if (value == null)
7502        this.lastReviewDate = null;
7503      else {
7504        if (this.lastReviewDate == null)
7505          this.lastReviewDate = new DateType();
7506        this.lastReviewDate.setValue(value);
7507      }
7508      return this;
7509    }
7510
7511    /**
7512     * @return {@link #effectivePeriod} (The period during which the plan definition content was or is planned to be in active use.)
7513     */
7514    public Period getEffectivePeriod() { 
7515      if (this.effectivePeriod == null)
7516        if (Configuration.errorOnAutoCreate())
7517          throw new Error("Attempt to auto-create PlanDefinition.effectivePeriod");
7518        else if (Configuration.doAutoCreate())
7519          this.effectivePeriod = new Period(); // cc
7520      return this.effectivePeriod;
7521    }
7522
7523    public boolean hasEffectivePeriod() { 
7524      return this.effectivePeriod != null && !this.effectivePeriod.isEmpty();
7525    }
7526
7527    /**
7528     * @param value {@link #effectivePeriod} (The period during which the plan definition content was or is planned to be in active use.)
7529     */
7530    public PlanDefinition setEffectivePeriod(Period value) { 
7531      this.effectivePeriod = value;
7532      return this;
7533    }
7534
7535    /**
7536     * @return {@link #topic} (Descriptive topics related to the content of the plan definition. Topics provide a high-level categorization of the definition that can be useful for filtering and searching.)
7537     */
7538    public List<CodeableConcept> getTopic() { 
7539      if (this.topic == null)
7540        this.topic = new ArrayList<CodeableConcept>();
7541      return this.topic;
7542    }
7543
7544    /**
7545     * @return Returns a reference to <code>this</code> for easy method chaining
7546     */
7547    public PlanDefinition setTopic(List<CodeableConcept> theTopic) { 
7548      this.topic = theTopic;
7549      return this;
7550    }
7551
7552    public boolean hasTopic() { 
7553      if (this.topic == null)
7554        return false;
7555      for (CodeableConcept item : this.topic)
7556        if (!item.isEmpty())
7557          return true;
7558      return false;
7559    }
7560
7561    public CodeableConcept addTopic() { //3
7562      CodeableConcept t = new CodeableConcept();
7563      if (this.topic == null)
7564        this.topic = new ArrayList<CodeableConcept>();
7565      this.topic.add(t);
7566      return t;
7567    }
7568
7569    public PlanDefinition addTopic(CodeableConcept t) { //3
7570      if (t == null)
7571        return this;
7572      if (this.topic == null)
7573        this.topic = new ArrayList<CodeableConcept>();
7574      this.topic.add(t);
7575      return this;
7576    }
7577
7578    /**
7579     * @return The first repetition of repeating field {@link #topic}, creating it if it does not already exist {3}
7580     */
7581    public CodeableConcept getTopicFirstRep() { 
7582      if (getTopic().isEmpty()) {
7583        addTopic();
7584      }
7585      return getTopic().get(0);
7586    }
7587
7588    /**
7589     * @return {@link #author} (An individiual or organization primarily involved in the creation and maintenance of the content.)
7590     */
7591    public List<ContactDetail> getAuthor() { 
7592      if (this.author == null)
7593        this.author = new ArrayList<ContactDetail>();
7594      return this.author;
7595    }
7596
7597    /**
7598     * @return Returns a reference to <code>this</code> for easy method chaining
7599     */
7600    public PlanDefinition setAuthor(List<ContactDetail> theAuthor) { 
7601      this.author = theAuthor;
7602      return this;
7603    }
7604
7605    public boolean hasAuthor() { 
7606      if (this.author == null)
7607        return false;
7608      for (ContactDetail item : this.author)
7609        if (!item.isEmpty())
7610          return true;
7611      return false;
7612    }
7613
7614    public ContactDetail addAuthor() { //3
7615      ContactDetail t = new ContactDetail();
7616      if (this.author == null)
7617        this.author = new ArrayList<ContactDetail>();
7618      this.author.add(t);
7619      return t;
7620    }
7621
7622    public PlanDefinition addAuthor(ContactDetail t) { //3
7623      if (t == null)
7624        return this;
7625      if (this.author == null)
7626        this.author = new ArrayList<ContactDetail>();
7627      this.author.add(t);
7628      return this;
7629    }
7630
7631    /**
7632     * @return The first repetition of repeating field {@link #author}, creating it if it does not already exist {3}
7633     */
7634    public ContactDetail getAuthorFirstRep() { 
7635      if (getAuthor().isEmpty()) {
7636        addAuthor();
7637      }
7638      return getAuthor().get(0);
7639    }
7640
7641    /**
7642     * @return {@link #editor} (An individual or organization primarily responsible for internal coherence of the content.)
7643     */
7644    public List<ContactDetail> getEditor() { 
7645      if (this.editor == null)
7646        this.editor = new ArrayList<ContactDetail>();
7647      return this.editor;
7648    }
7649
7650    /**
7651     * @return Returns a reference to <code>this</code> for easy method chaining
7652     */
7653    public PlanDefinition setEditor(List<ContactDetail> theEditor) { 
7654      this.editor = theEditor;
7655      return this;
7656    }
7657
7658    public boolean hasEditor() { 
7659      if (this.editor == null)
7660        return false;
7661      for (ContactDetail item : this.editor)
7662        if (!item.isEmpty())
7663          return true;
7664      return false;
7665    }
7666
7667    public ContactDetail addEditor() { //3
7668      ContactDetail t = new ContactDetail();
7669      if (this.editor == null)
7670        this.editor = new ArrayList<ContactDetail>();
7671      this.editor.add(t);
7672      return t;
7673    }
7674
7675    public PlanDefinition addEditor(ContactDetail t) { //3
7676      if (t == null)
7677        return this;
7678      if (this.editor == null)
7679        this.editor = new ArrayList<ContactDetail>();
7680      this.editor.add(t);
7681      return this;
7682    }
7683
7684    /**
7685     * @return The first repetition of repeating field {@link #editor}, creating it if it does not already exist {3}
7686     */
7687    public ContactDetail getEditorFirstRep() { 
7688      if (getEditor().isEmpty()) {
7689        addEditor();
7690      }
7691      return getEditor().get(0);
7692    }
7693
7694    /**
7695     * @return {@link #reviewer} (An individual or organization asserted by the publisher to be primarily responsible for review of some aspect of the content.)
7696     */
7697    public List<ContactDetail> getReviewer() { 
7698      if (this.reviewer == null)
7699        this.reviewer = new ArrayList<ContactDetail>();
7700      return this.reviewer;
7701    }
7702
7703    /**
7704     * @return Returns a reference to <code>this</code> for easy method chaining
7705     */
7706    public PlanDefinition setReviewer(List<ContactDetail> theReviewer) { 
7707      this.reviewer = theReviewer;
7708      return this;
7709    }
7710
7711    public boolean hasReviewer() { 
7712      if (this.reviewer == null)
7713        return false;
7714      for (ContactDetail item : this.reviewer)
7715        if (!item.isEmpty())
7716          return true;
7717      return false;
7718    }
7719
7720    public ContactDetail addReviewer() { //3
7721      ContactDetail t = new ContactDetail();
7722      if (this.reviewer == null)
7723        this.reviewer = new ArrayList<ContactDetail>();
7724      this.reviewer.add(t);
7725      return t;
7726    }
7727
7728    public PlanDefinition addReviewer(ContactDetail t) { //3
7729      if (t == null)
7730        return this;
7731      if (this.reviewer == null)
7732        this.reviewer = new ArrayList<ContactDetail>();
7733      this.reviewer.add(t);
7734      return this;
7735    }
7736
7737    /**
7738     * @return The first repetition of repeating field {@link #reviewer}, creating it if it does not already exist {3}
7739     */
7740    public ContactDetail getReviewerFirstRep() { 
7741      if (getReviewer().isEmpty()) {
7742        addReviewer();
7743      }
7744      return getReviewer().get(0);
7745    }
7746
7747    /**
7748     * @return {@link #endorser} (An individual or organization asserted by the publisher to be responsible for officially endorsing the content for use in some setting.)
7749     */
7750    public List<ContactDetail> getEndorser() { 
7751      if (this.endorser == null)
7752        this.endorser = new ArrayList<ContactDetail>();
7753      return this.endorser;
7754    }
7755
7756    /**
7757     * @return Returns a reference to <code>this</code> for easy method chaining
7758     */
7759    public PlanDefinition setEndorser(List<ContactDetail> theEndorser) { 
7760      this.endorser = theEndorser;
7761      return this;
7762    }
7763
7764    public boolean hasEndorser() { 
7765      if (this.endorser == null)
7766        return false;
7767      for (ContactDetail item : this.endorser)
7768        if (!item.isEmpty())
7769          return true;
7770      return false;
7771    }
7772
7773    public ContactDetail addEndorser() { //3
7774      ContactDetail t = new ContactDetail();
7775      if (this.endorser == null)
7776        this.endorser = new ArrayList<ContactDetail>();
7777      this.endorser.add(t);
7778      return t;
7779    }
7780
7781    public PlanDefinition addEndorser(ContactDetail t) { //3
7782      if (t == null)
7783        return this;
7784      if (this.endorser == null)
7785        this.endorser = new ArrayList<ContactDetail>();
7786      this.endorser.add(t);
7787      return this;
7788    }
7789
7790    /**
7791     * @return The first repetition of repeating field {@link #endorser}, creating it if it does not already exist {3}
7792     */
7793    public ContactDetail getEndorserFirstRep() { 
7794      if (getEndorser().isEmpty()) {
7795        addEndorser();
7796      }
7797      return getEndorser().get(0);
7798    }
7799
7800    /**
7801     * @return {@link #relatedArtifact} (Related artifacts such as additional documentation, justification, or bibliographic references.)
7802     */
7803    public List<RelatedArtifact> getRelatedArtifact() { 
7804      if (this.relatedArtifact == null)
7805        this.relatedArtifact = new ArrayList<RelatedArtifact>();
7806      return this.relatedArtifact;
7807    }
7808
7809    /**
7810     * @return Returns a reference to <code>this</code> for easy method chaining
7811     */
7812    public PlanDefinition setRelatedArtifact(List<RelatedArtifact> theRelatedArtifact) { 
7813      this.relatedArtifact = theRelatedArtifact;
7814      return this;
7815    }
7816
7817    public boolean hasRelatedArtifact() { 
7818      if (this.relatedArtifact == null)
7819        return false;
7820      for (RelatedArtifact item : this.relatedArtifact)
7821        if (!item.isEmpty())
7822          return true;
7823      return false;
7824    }
7825
7826    public RelatedArtifact addRelatedArtifact() { //3
7827      RelatedArtifact t = new RelatedArtifact();
7828      if (this.relatedArtifact == null)
7829        this.relatedArtifact = new ArrayList<RelatedArtifact>();
7830      this.relatedArtifact.add(t);
7831      return t;
7832    }
7833
7834    public PlanDefinition addRelatedArtifact(RelatedArtifact t) { //3
7835      if (t == null)
7836        return this;
7837      if (this.relatedArtifact == null)
7838        this.relatedArtifact = new ArrayList<RelatedArtifact>();
7839      this.relatedArtifact.add(t);
7840      return this;
7841    }
7842
7843    /**
7844     * @return The first repetition of repeating field {@link #relatedArtifact}, creating it if it does not already exist {3}
7845     */
7846    public RelatedArtifact getRelatedArtifactFirstRep() { 
7847      if (getRelatedArtifact().isEmpty()) {
7848        addRelatedArtifact();
7849      }
7850      return getRelatedArtifact().get(0);
7851    }
7852
7853    /**
7854     * @return {@link #library} (A reference to a Library resource containing any formal logic used by the plan definition.)
7855     */
7856    public List<CanonicalType> getLibrary() { 
7857      if (this.library == null)
7858        this.library = new ArrayList<CanonicalType>();
7859      return this.library;
7860    }
7861
7862    /**
7863     * @return Returns a reference to <code>this</code> for easy method chaining
7864     */
7865    public PlanDefinition setLibrary(List<CanonicalType> theLibrary) { 
7866      this.library = theLibrary;
7867      return this;
7868    }
7869
7870    public boolean hasLibrary() { 
7871      if (this.library == null)
7872        return false;
7873      for (CanonicalType item : this.library)
7874        if (!item.isEmpty())
7875          return true;
7876      return false;
7877    }
7878
7879    /**
7880     * @return {@link #library} (A reference to a Library resource containing any formal logic used by the plan definition.)
7881     */
7882    public CanonicalType addLibraryElement() {//2 
7883      CanonicalType t = new CanonicalType();
7884      if (this.library == null)
7885        this.library = new ArrayList<CanonicalType>();
7886      this.library.add(t);
7887      return t;
7888    }
7889
7890    /**
7891     * @param value {@link #library} (A reference to a Library resource containing any formal logic used by the plan definition.)
7892     */
7893    public PlanDefinition addLibrary(String value) { //1
7894      CanonicalType t = new CanonicalType();
7895      t.setValue(value);
7896      if (this.library == null)
7897        this.library = new ArrayList<CanonicalType>();
7898      this.library.add(t);
7899      return this;
7900    }
7901
7902    /**
7903     * @param value {@link #library} (A reference to a Library resource containing any formal logic used by the plan definition.)
7904     */
7905    public boolean hasLibrary(String value) { 
7906      if (this.library == null)
7907        return false;
7908      for (CanonicalType v : this.library)
7909        if (v.getValue().equals(value)) // canonical
7910          return true;
7911      return false;
7912    }
7913
7914    /**
7915     * @return {@link #goal} (A goal describes an expected outcome that activities within the plan are intended to achieve. For example, weight loss, restoring an activity of daily living, obtaining herd immunity via immunization, meeting a process improvement objective, meeting the acceptance criteria for a test as specified by a quality specification, etc.)
7916     */
7917    public List<PlanDefinitionGoalComponent> getGoal() { 
7918      if (this.goal == null)
7919        this.goal = new ArrayList<PlanDefinitionGoalComponent>();
7920      return this.goal;
7921    }
7922
7923    /**
7924     * @return Returns a reference to <code>this</code> for easy method chaining
7925     */
7926    public PlanDefinition setGoal(List<PlanDefinitionGoalComponent> theGoal) { 
7927      this.goal = theGoal;
7928      return this;
7929    }
7930
7931    public boolean hasGoal() { 
7932      if (this.goal == null)
7933        return false;
7934      for (PlanDefinitionGoalComponent item : this.goal)
7935        if (!item.isEmpty())
7936          return true;
7937      return false;
7938    }
7939
7940    public PlanDefinitionGoalComponent addGoal() { //3
7941      PlanDefinitionGoalComponent t = new PlanDefinitionGoalComponent();
7942      if (this.goal == null)
7943        this.goal = new ArrayList<PlanDefinitionGoalComponent>();
7944      this.goal.add(t);
7945      return t;
7946    }
7947
7948    public PlanDefinition addGoal(PlanDefinitionGoalComponent t) { //3
7949      if (t == null)
7950        return this;
7951      if (this.goal == null)
7952        this.goal = new ArrayList<PlanDefinitionGoalComponent>();
7953      this.goal.add(t);
7954      return this;
7955    }
7956
7957    /**
7958     * @return The first repetition of repeating field {@link #goal}, creating it if it does not already exist {3}
7959     */
7960    public PlanDefinitionGoalComponent getGoalFirstRep() { 
7961      if (getGoal().isEmpty()) {
7962        addGoal();
7963      }
7964      return getGoal().get(0);
7965    }
7966
7967    /**
7968     * @return {@link #actor} (Actors represent the individuals or groups involved in the execution of the defined set of activities.)
7969     */
7970    public List<PlanDefinitionActorComponent> getActor() { 
7971      if (this.actor == null)
7972        this.actor = new ArrayList<PlanDefinitionActorComponent>();
7973      return this.actor;
7974    }
7975
7976    /**
7977     * @return Returns a reference to <code>this</code> for easy method chaining
7978     */
7979    public PlanDefinition setActor(List<PlanDefinitionActorComponent> theActor) { 
7980      this.actor = theActor;
7981      return this;
7982    }
7983
7984    public boolean hasActor() { 
7985      if (this.actor == null)
7986        return false;
7987      for (PlanDefinitionActorComponent item : this.actor)
7988        if (!item.isEmpty())
7989          return true;
7990      return false;
7991    }
7992
7993    public PlanDefinitionActorComponent addActor() { //3
7994      PlanDefinitionActorComponent t = new PlanDefinitionActorComponent();
7995      if (this.actor == null)
7996        this.actor = new ArrayList<PlanDefinitionActorComponent>();
7997      this.actor.add(t);
7998      return t;
7999    }
8000
8001    public PlanDefinition addActor(PlanDefinitionActorComponent t) { //3
8002      if (t == null)
8003        return this;
8004      if (this.actor == null)
8005        this.actor = new ArrayList<PlanDefinitionActorComponent>();
8006      this.actor.add(t);
8007      return this;
8008    }
8009
8010    /**
8011     * @return The first repetition of repeating field {@link #actor}, creating it if it does not already exist {3}
8012     */
8013    public PlanDefinitionActorComponent getActorFirstRep() { 
8014      if (getActor().isEmpty()) {
8015        addActor();
8016      }
8017      return getActor().get(0);
8018    }
8019
8020    /**
8021     * @return {@link #action} (An action or group of actions to be taken as part of the plan. For example, in clinical care, an action would be to prescribe a particular indicated medication, or perform a particular test as appropriate. In pharmaceutical quality, an action would be the test that needs to be performed on a drug product as defined in the quality specification.)
8022     */
8023    public List<PlanDefinitionActionComponent> getAction() { 
8024      if (this.action == null)
8025        this.action = new ArrayList<PlanDefinitionActionComponent>();
8026      return this.action;
8027    }
8028
8029    /**
8030     * @return Returns a reference to <code>this</code> for easy method chaining
8031     */
8032    public PlanDefinition setAction(List<PlanDefinitionActionComponent> theAction) { 
8033      this.action = theAction;
8034      return this;
8035    }
8036
8037    public boolean hasAction() { 
8038      if (this.action == null)
8039        return false;
8040      for (PlanDefinitionActionComponent item : this.action)
8041        if (!item.isEmpty())
8042          return true;
8043      return false;
8044    }
8045
8046    public PlanDefinitionActionComponent addAction() { //3
8047      PlanDefinitionActionComponent t = new PlanDefinitionActionComponent();
8048      if (this.action == null)
8049        this.action = new ArrayList<PlanDefinitionActionComponent>();
8050      this.action.add(t);
8051      return t;
8052    }
8053
8054    public PlanDefinition addAction(PlanDefinitionActionComponent t) { //3
8055      if (t == null)
8056        return this;
8057      if (this.action == null)
8058        this.action = new ArrayList<PlanDefinitionActionComponent>();
8059      this.action.add(t);
8060      return this;
8061    }
8062
8063    /**
8064     * @return The first repetition of repeating field {@link #action}, creating it if it does not already exist {3}
8065     */
8066    public PlanDefinitionActionComponent getActionFirstRep() { 
8067      if (getAction().isEmpty()) {
8068        addAction();
8069      }
8070      return getAction().get(0);
8071    }
8072
8073    /**
8074     * @return {@link #asNeeded} (If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example "pain", "on flare-up", etc.)
8075     */
8076    public DataType getAsNeeded() { 
8077      return this.asNeeded;
8078    }
8079
8080    /**
8081     * @return {@link #asNeeded} (If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example "pain", "on flare-up", etc.)
8082     */
8083    public BooleanType getAsNeededBooleanType() throws FHIRException { 
8084      if (this.asNeeded == null)
8085        this.asNeeded = new BooleanType();
8086      if (!(this.asNeeded instanceof BooleanType))
8087        throw new FHIRException("Type mismatch: the type BooleanType was expected, but "+this.asNeeded.getClass().getName()+" was encountered");
8088      return (BooleanType) this.asNeeded;
8089    }
8090
8091    public boolean hasAsNeededBooleanType() { 
8092      return this != null && this.asNeeded instanceof BooleanType;
8093    }
8094
8095    /**
8096     * @return {@link #asNeeded} (If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example "pain", "on flare-up", etc.)
8097     */
8098    public CodeableConcept getAsNeededCodeableConcept() throws FHIRException { 
8099      if (this.asNeeded == null)
8100        this.asNeeded = new CodeableConcept();
8101      if (!(this.asNeeded instanceof CodeableConcept))
8102        throw new FHIRException("Type mismatch: the type CodeableConcept was expected, but "+this.asNeeded.getClass().getName()+" was encountered");
8103      return (CodeableConcept) this.asNeeded;
8104    }
8105
8106    public boolean hasAsNeededCodeableConcept() { 
8107      return this != null && this.asNeeded instanceof CodeableConcept;
8108    }
8109
8110    public boolean hasAsNeeded() { 
8111      return this.asNeeded != null && !this.asNeeded.isEmpty();
8112    }
8113
8114    /**
8115     * @param value {@link #asNeeded} (If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example "pain", "on flare-up", etc.)
8116     */
8117    public PlanDefinition setAsNeeded(DataType value) { 
8118      if (value != null && !(value instanceof BooleanType || value instanceof CodeableConcept))
8119        throw new FHIRException("Not the right type for PlanDefinition.asNeeded[x]: "+value.fhirType());
8120      this.asNeeded = value;
8121      return this;
8122    }
8123
8124      protected void listChildren(List<Property> children) {
8125        super.listChildren(children);
8126        children.add(new Property("url", "uri", "An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.", 0, 1, url));
8127        children.add(new Property("identifier", "Identifier", "A formal identifier that is used to identify this plan definition when it is represented in other formats, or referenced in a specification, model, design or an instance.", 0, java.lang.Integer.MAX_VALUE, identifier));
8128        children.add(new Property("version", "string", "The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.", 0, 1, version));
8129        children.add(new Property("versionAlgorithm[x]", "string|Coding", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm));
8130        children.add(new Property("name", "string", "A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name));
8131        children.add(new Property("title", "string", "A short, descriptive, user-friendly title for the plan definition.", 0, 1, title));
8132        children.add(new Property("subtitle", "string", "An explanatory or alternate title for the plan definition giving additional information about its content.", 0, 1, subtitle));
8133        children.add(new Property("type", "CodeableConcept", "A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition.", 0, 1, type));
8134        children.add(new Property("status", "code", "The status of this plan definition. Enables tracking the life-cycle of the content.", 0, 1, status));
8135        children.add(new Property("experimental", "boolean", "A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.", 0, 1, experimental));
8136        children.add(new Property("subject[x]", "CodeableConcept|Reference(Group|MedicinalProductDefinition|SubstanceDefinition|AdministrableProductDefinition|ManufacturedItemDefinition|PackagedProductDefinition)|canonical(EvidenceVariable)", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject));
8137        children.add(new Property("date", "dateTime", "The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.", 0, 1, date));
8138        children.add(new Property("publisher", "string", "The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.", 0, 1, publisher));
8139        children.add(new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact));
8140        children.add(new Property("description", "markdown", "A free text natural language description of the plan definition from a consumer's perspective.", 0, 1, description));
8141        children.add(new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate plan definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext));
8142        children.add(new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the plan definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction));
8143        children.add(new Property("purpose", "markdown", "Explanation of why this plan definition is needed and why it has been designed as it has.", 0, 1, purpose));
8144        children.add(new Property("usage", "markdown", "A detailed description of how the plan definition is used from a clinical perspective.", 0, 1, usage));
8145        children.add(new Property("copyright", "markdown", "A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.", 0, 1, copyright));
8146        children.add(new Property("copyrightLabel", "string", "A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').", 0, 1, copyrightLabel));
8147        children.add(new Property("approvalDate", "date", "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.", 0, 1, approvalDate));
8148        children.add(new Property("lastReviewDate", "date", "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.", 0, 1, lastReviewDate));
8149        children.add(new Property("effectivePeriod", "Period", "The period during which the plan definition content was or is planned to be in active use.", 0, 1, effectivePeriod));
8150        children.add(new Property("topic", "CodeableConcept", "Descriptive topics related to the content of the plan definition. Topics provide a high-level categorization of the definition that can be useful for filtering and searching.", 0, java.lang.Integer.MAX_VALUE, topic));
8151        children.add(new Property("author", "ContactDetail", "An individiual or organization primarily involved in the creation and maintenance of the content.", 0, java.lang.Integer.MAX_VALUE, author));
8152        children.add(new Property("editor", "ContactDetail", "An individual or organization primarily responsible for internal coherence of the content.", 0, java.lang.Integer.MAX_VALUE, editor));
8153        children.add(new Property("reviewer", "ContactDetail", "An individual or organization asserted by the publisher to be primarily responsible for review of some aspect of the content.", 0, java.lang.Integer.MAX_VALUE, reviewer));
8154        children.add(new Property("endorser", "ContactDetail", "An individual or organization asserted by the publisher to be responsible for officially endorsing the content for use in some setting.", 0, java.lang.Integer.MAX_VALUE, endorser));
8155        children.add(new Property("relatedArtifact", "RelatedArtifact", "Related artifacts such as additional documentation, justification, or bibliographic references.", 0, java.lang.Integer.MAX_VALUE, relatedArtifact));
8156        children.add(new Property("library", "canonical(Library)", "A reference to a Library resource containing any formal logic used by the plan definition.", 0, java.lang.Integer.MAX_VALUE, library));
8157        children.add(new Property("goal", "", "A goal describes an expected outcome that activities within the plan are intended to achieve. For example, weight loss, restoring an activity of daily living, obtaining herd immunity via immunization, meeting a process improvement objective, meeting the acceptance criteria for a test as specified by a quality specification, etc.", 0, java.lang.Integer.MAX_VALUE, goal));
8158        children.add(new Property("actor", "", "Actors represent the individuals or groups involved in the execution of the defined set of activities.", 0, java.lang.Integer.MAX_VALUE, actor));
8159        children.add(new Property("action", "", "An action or group of actions to be taken as part of the plan. For example, in clinical care, an action would be to prescribe a particular indicated medication, or perform a particular test as appropriate. In pharmaceutical quality, an action would be the test that needs to be performed on a drug product as defined in the quality specification.", 0, java.lang.Integer.MAX_VALUE, action));
8160        children.add(new Property("asNeeded[x]", "boolean|CodeableConcept", "If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc.", 0, 1, asNeeded));
8161      }
8162
8163      @Override
8164      public Property getNamedProperty(int _hash, String _name, boolean _checkValid) throws FHIRException {
8165        switch (_hash) {
8166        case 116079: /*url*/  return new Property("url", "uri", "An absolute URI that is used to identify this plan definition when it is referenced in a specification, model, design or an instance; also called its canonical identifier. This SHOULD be globally unique and SHOULD be a literal address at which an authoritative instance of this plan definition is (or will be) published. This URL can be the target of a canonical reference. It SHALL remain the same when the plan definition is stored on different servers.", 0, 1, url);
8167        case -1618432855: /*identifier*/  return new Property("identifier", "Identifier", "A formal identifier that is used to identify this plan definition when it is represented in other formats, or referenced in a specification, model, design or an instance.", 0, java.lang.Integer.MAX_VALUE, identifier);
8168        case 351608024: /*version*/  return new Property("version", "string", "The identifier that is used to identify this version of the plan definition when it is referenced in a specification, model, design or instance. This is an arbitrary value managed by the plan definition author and is not expected to be globally unique. For example, it might be a timestamp (e.g. yyyymmdd) if a managed version is not available. There is also no expectation that versions can be placed in a lexicographical sequence. To provide a version consistent with the Decision Support Service specification, use the format Major.Minor.Revision (e.g. 1.0.0). For more information on versioning knowledge assets, refer to the Decision Support Service specification. Note that a version is required for non-experimental active artifacts.", 0, 1, version);
8169        case -115699031: /*versionAlgorithm[x]*/  return new Property("versionAlgorithm[x]", "string|Coding", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm);
8170        case 1508158071: /*versionAlgorithm*/  return new Property("versionAlgorithm[x]", "string|Coding", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm);
8171        case 1836908904: /*versionAlgorithmString*/  return new Property("versionAlgorithm[x]", "string", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm);
8172        case 1373807809: /*versionAlgorithmCoding*/  return new Property("versionAlgorithm[x]", "Coding", "Indicates the mechanism used to compare versions to determine which is more current.", 0, 1, versionAlgorithm);
8173        case 3373707: /*name*/  return new Property("name", "string", "A natural language name identifying the plan definition. This name should be usable as an identifier for the module by machine processing applications such as code generation.", 0, 1, name);
8174        case 110371416: /*title*/  return new Property("title", "string", "A short, descriptive, user-friendly title for the plan definition.", 0, 1, title);
8175        case -2060497896: /*subtitle*/  return new Property("subtitle", "string", "An explanatory or alternate title for the plan definition giving additional information about its content.", 0, 1, subtitle);
8176        case 3575610: /*type*/  return new Property("type", "CodeableConcept", "A high-level category for the plan definition that distinguishes the kinds of systems that would be interested in the plan definition.", 0, 1, type);
8177        case -892481550: /*status*/  return new Property("status", "code", "The status of this plan definition. Enables tracking the life-cycle of the content.", 0, 1, status);
8178        case -404562712: /*experimental*/  return new Property("experimental", "boolean", "A Boolean value to indicate that this plan definition is authored for testing purposes (or education/evaluation/marketing) and is not intended to be used for genuine usage.", 0, 1, experimental);
8179        case -573640748: /*subject[x]*/  return new Property("subject[x]", "CodeableConcept|Reference(Group|MedicinalProductDefinition|SubstanceDefinition|AdministrableProductDefinition|ManufacturedItemDefinition|PackagedProductDefinition)|canonical(EvidenceVariable)", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
8180        case -1867885268: /*subject*/  return new Property("subject[x]", "CodeableConcept|Reference(Group|MedicinalProductDefinition|SubstanceDefinition|AdministrableProductDefinition|ManufacturedItemDefinition|PackagedProductDefinition)|canonical(EvidenceVariable)", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
8181        case -1257122603: /*subjectCodeableConcept*/  return new Property("subject[x]", "CodeableConcept", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
8182        case 772938623: /*subjectReference*/  return new Property("subject[x]", "Reference(Group|MedicinalProductDefinition|SubstanceDefinition|AdministrableProductDefinition|ManufacturedItemDefinition|PackagedProductDefinition)", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
8183        case -1768521432: /*subjectCanonical*/  return new Property("subject[x]", "canonical(EvidenceVariable)", "A code, group definition, or canonical reference that describes  or identifies the intended subject of the plan definition. Canonical references are allowed to support the definition of protocols for drug and substance quality specifications, and is allowed to reference a MedicinalProductDefinition, SubstanceDefinition, AdministrableProductDefinition, ManufacturedItemDefinition, or PackagedProductDefinition resource.", 0, 1, subject);
8184        case 3076014: /*date*/  return new Property("date", "dateTime", "The date  (and optionally time) when the plan definition was last significantly changed. The date must change when the business version changes and it must change if the status code changes. In addition, it should change when the substantive content of the plan definition changes.", 0, 1, date);
8185        case 1447404028: /*publisher*/  return new Property("publisher", "string", "The name of the organization or individual responsible for the release and ongoing maintenance of the plan definition.", 0, 1, publisher);
8186        case 951526432: /*contact*/  return new Property("contact", "ContactDetail", "Contact details to assist a user in finding and communicating with the publisher.", 0, java.lang.Integer.MAX_VALUE, contact);
8187        case -1724546052: /*description*/  return new Property("description", "markdown", "A free text natural language description of the plan definition from a consumer's perspective.", 0, 1, description);
8188        case -669707736: /*useContext*/  return new Property("useContext", "UsageContext", "The content was developed with a focus and intent of supporting the contexts that are listed. These contexts may be general categories (gender, age, ...) or may be references to specific programs (insurance plans, studies, ...) and may be used to assist with indexing and searching for appropriate plan definition instances.", 0, java.lang.Integer.MAX_VALUE, useContext);
8189        case -507075711: /*jurisdiction*/  return new Property("jurisdiction", "CodeableConcept", "A legal or geographic region in which the plan definition is intended to be used.", 0, java.lang.Integer.MAX_VALUE, jurisdiction);
8190        case -220463842: /*purpose*/  return new Property("purpose", "markdown", "Explanation of why this plan definition is needed and why it has been designed as it has.", 0, 1, purpose);
8191        case 111574433: /*usage*/  return new Property("usage", "markdown", "A detailed description of how the plan definition is used from a clinical perspective.", 0, 1, usage);
8192        case 1522889671: /*copyright*/  return new Property("copyright", "markdown", "A copyright statement relating to the plan definition and/or its contents. Copyright statements are generally legal restrictions on the use and publishing of the plan definition.", 0, 1, copyright);
8193        case 765157229: /*copyrightLabel*/  return new Property("copyrightLabel", "string", "A short string (<50 characters), suitable for inclusion in a page footer that identifies the copyright holder, effective period, and optionally whether rights are resctricted. (e.g. 'All rights reserved', 'Some rights reserved').", 0, 1, copyrightLabel);
8194        case 223539345: /*approvalDate*/  return new Property("approvalDate", "date", "The date on which the resource content was approved by the publisher. Approval happens once when the content is officially approved for usage.", 0, 1, approvalDate);
8195        case -1687512484: /*lastReviewDate*/  return new Property("lastReviewDate", "date", "The date on which the resource content was last reviewed. Review happens periodically after approval but does not change the original approval date.", 0, 1, lastReviewDate);
8196        case -403934648: /*effectivePeriod*/  return new Property("effectivePeriod", "Period", "The period during which the plan definition content was or is planned to be in active use.", 0, 1, effectivePeriod);
8197        case 110546223: /*topic*/  return new Property("topic", "CodeableConcept", "Descriptive topics related to the content of the plan definition. Topics provide a high-level categorization of the definition that can be useful for filtering and searching.", 0, java.lang.Integer.MAX_VALUE, topic);
8198        case -1406328437: /*author*/  return new Property("author", "ContactDetail", "An individiual or organization primarily involved in the creation and maintenance of the content.", 0, java.lang.Integer.MAX_VALUE, author);
8199        case -1307827859: /*editor*/  return new Property("editor", "ContactDetail", "An individual or organization primarily responsible for internal coherence of the content.", 0, java.lang.Integer.MAX_VALUE, editor);
8200        case -261190139: /*reviewer*/  return new Property("reviewer", "ContactDetail", "An individual or organization asserted by the publisher to be primarily responsible for review of some aspect of the content.", 0, java.lang.Integer.MAX_VALUE, reviewer);
8201        case 1740277666: /*endorser*/  return new Property("endorser", "ContactDetail", "An individual or organization asserted by the publisher to be responsible for officially endorsing the content for use in some setting.", 0, java.lang.Integer.MAX_VALUE, endorser);
8202        case 666807069: /*relatedArtifact*/  return new Property("relatedArtifact", "RelatedArtifact", "Related artifacts such as additional documentation, justification, or bibliographic references.", 0, java.lang.Integer.MAX_VALUE, relatedArtifact);
8203        case 166208699: /*library*/  return new Property("library", "canonical(Library)", "A reference to a Library resource containing any formal logic used by the plan definition.", 0, java.lang.Integer.MAX_VALUE, library);
8204        case 3178259: /*goal*/  return new Property("goal", "", "A goal describes an expected outcome that activities within the plan are intended to achieve. For example, weight loss, restoring an activity of daily living, obtaining herd immunity via immunization, meeting a process improvement objective, meeting the acceptance criteria for a test as specified by a quality specification, etc.", 0, java.lang.Integer.MAX_VALUE, goal);
8205        case 92645877: /*actor*/  return new Property("actor", "", "Actors represent the individuals or groups involved in the execution of the defined set of activities.", 0, java.lang.Integer.MAX_VALUE, actor);
8206        case -1422950858: /*action*/  return new Property("action", "", "An action or group of actions to be taken as part of the plan. For example, in clinical care, an action would be to prescribe a particular indicated medication, or perform a particular test as appropriate. In pharmaceutical quality, an action would be the test that needs to be performed on a drug product as defined in the quality specification.", 0, java.lang.Integer.MAX_VALUE, action);
8207        case -544329575: /*asNeeded[x]*/  return new Property("asNeeded[x]", "boolean|CodeableConcept", "If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc.", 0, 1, asNeeded);
8208        case -1432923513: /*asNeeded*/  return new Property("asNeeded[x]", "boolean|CodeableConcept", "If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc.", 0, 1, asNeeded);
8209        case -591717471: /*asNeededBoolean*/  return new Property("asNeeded[x]", "boolean", "If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc.", 0, 1, asNeeded);
8210        case 1556420122: /*asNeededCodeableConcept*/  return new Property("asNeeded[x]", "CodeableConcept", "If a CodeableConcept is present, it indicates the pre-condition for performing the service.  For example \"pain\", \"on flare-up\", etc.", 0, 1, asNeeded);
8211        default: return super.getNamedProperty(_hash, _name, _checkValid);
8212        }
8213
8214      }
8215
8216      @Override
8217      public Base[] getProperty(int hash, String name, boolean checkValid) throws FHIRException {
8218        switch (hash) {
8219        case 116079: /*url*/ return this.url == null ? new Base[0] : new Base[] {this.url}; // UriType
8220        case -1618432855: /*identifier*/ return this.identifier == null ? new Base[0] : this.identifier.toArray(new Base[this.identifier.size()]); // Identifier
8221        case 351608024: /*version*/ return this.version == null ? new Base[0] : new Base[] {this.version}; // StringType
8222        case 1508158071: /*versionAlgorithm*/ return this.versionAlgorithm == null ? new Base[0] : new Base[] {this.versionAlgorithm}; // DataType
8223        case 3373707: /*name*/ return this.name == null ? new Base[0] : new Base[] {this.name}; // StringType
8224        case 110371416: /*title*/ return this.title == null ? new Base[0] : new Base[] {this.title}; // StringType
8225        case -2060497896: /*subtitle*/ return this.subtitle == null ? new Base[0] : new Base[] {this.subtitle}; // StringType
8226        case 3575610: /*type*/ return this.type == null ? new Base[0] : new Base[] {this.type}; // CodeableConcept
8227        case -892481550: /*status*/ return this.status == null ? new Base[0] : new Base[] {this.status}; // Enumeration<PublicationStatus>
8228        case -404562712: /*experimental*/ return this.experimental == null ? new Base[0] : new Base[] {this.experimental}; // BooleanType
8229        case -1867885268: /*subject*/ return this.subject == null ? new Base[0] : new Base[] {this.subject}; // DataType
8230        case 3076014: /*date*/ return this.date == null ? new Base[0] : new Base[] {this.date}; // DateTimeType
8231        case 1447404028: /*publisher*/ return this.publisher == null ? new Base[0] : new Base[] {this.publisher}; // StringType
8232        case 951526432: /*contact*/ return this.contact == null ? new Base[0] : this.contact.toArray(new Base[this.contact.size()]); // ContactDetail
8233        case -1724546052: /*description*/ return this.description == null ? new Base[0] : new Base[] {this.description}; // MarkdownType
8234        case -669707736: /*useContext*/ return this.useContext == null ? new Base[0] : this.useContext.toArray(new Base[this.useContext.size()]); // UsageContext
8235        case -507075711: /*jurisdiction*/ return this.jurisdiction == null ? new Base[0] : this.jurisdiction.toArray(new Base[this.jurisdiction.size()]); // CodeableConcept
8236        case -220463842: /*purpose*/ return this.purpose == null ? new Base[0] : new Base[] {this.purpose}; // MarkdownType
8237        case 111574433: /*usage*/ return this.usage == null ? new Base[0] : new Base[] {this.usage}; // MarkdownType
8238        case 1522889671: /*copyright*/ return this.copyright == null ? new Base[0] : new Base[] {this.copyright}; // MarkdownType
8239        case 765157229: /*copyrightLabel*/ return this.copyrightLabel == null ? new Base[0] : new Base[] {this.copyrightLabel}; // StringType
8240        case 223539345: /*approvalDate*/ return this.approvalDate == null ? new Base[0] : new Base[] {this.approvalDate}; // DateType
8241        case -1687512484: /*lastReviewDate*/ return this.lastReviewDate == null ? new Base[0] : new Base[] {this.lastReviewDate}; // DateType
8242        case -403934648: /*effectivePeriod*/ return this.effectivePeriod == null ? new Base[0] : new Base[] {this.effectivePeriod}; // Period
8243        case 110546223: /*topic*/ return this.topic == null ? new Base[0] : this.topic.toArray(new Base[this.topic.size()]); // CodeableConcept
8244        case -1406328437: /*author*/ return this.author == null ? new Base[0] : this.author.toArray(new Base[this.author.size()]); // ContactDetail
8245        case -1307827859: /*editor*/ return this.editor == null ? new Base[0] : this.editor.toArray(new Base[this.editor.size()]); // ContactDetail
8246        case -261190139: /*reviewer*/ return this.reviewer == null ? new Base[0] : this.reviewer.toArray(new Base[this.reviewer.size()]); // ContactDetail
8247        case 1740277666: /*endorser*/ return this.endorser == null ? new Base[0] : this.endorser.toArray(new Base[this.endorser.size()]); // ContactDetail
8248        case 666807069: /*relatedArtifact*/ return this.relatedArtifact == null ? new Base[0] : this.relatedArtifact.toArray(new Base[this.relatedArtifact.size()]); // RelatedArtifact
8249        case 166208699: /*library*/ return this.library == null ? new Base[0] : this.library.toArray(new Base[this.library.size()]); // CanonicalType
8250        case 3178259: /*goal*/ return this.goal == null ? new Base[0] : this.goal.toArray(new Base[this.goal.size()]); // PlanDefinitionGoalComponent
8251        case 92645877: /*actor*/ return this.actor == null ? new Base[0] : this.actor.toArray(new Base[this.actor.size()]); // PlanDefinitionActorComponent
8252        case -1422950858: /*action*/ return this.action == null ? new Base[0] : this.action.toArray(new Base[this.action.size()]); // PlanDefinitionActionComponent
8253        case -1432923513: /*asNeeded*/ return this.asNeeded == null ? new Base[0] : new Base[] {this.asNeeded}; // DataType
8254        default: return super.getProperty(hash, name, checkValid);
8255        }
8256
8257      }
8258
8259      @Override
8260      public Base setProperty(int hash, String name, Base value) throws FHIRException {
8261        switch (hash) {
8262        case 116079: // url
8263          this.url = TypeConvertor.castToUri(value); // UriType
8264          return value;
8265        case -1618432855: // identifier
8266          this.getIdentifier().add(TypeConvertor.castToIdentifier(value)); // Identifier
8267          return value;
8268        case 351608024: // version
8269          this.version = TypeConvertor.castToString(value); // StringType
8270          return value;
8271        case 1508158071: // versionAlgorithm
8272          this.versionAlgorithm = TypeConvertor.castToType(value); // DataType
8273          return value;
8274        case 3373707: // name
8275          this.name = TypeConvertor.castToString(value); // StringType
8276          return value;
8277        case 110371416: // title
8278          this.title = TypeConvertor.castToString(value); // StringType
8279          return value;
8280        case -2060497896: // subtitle
8281          this.subtitle = TypeConvertor.castToString(value); // StringType
8282          return value;
8283        case 3575610: // type
8284          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8285          return value;
8286        case -892481550: // status
8287          value = new PublicationStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
8288          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
8289          return value;
8290        case -404562712: // experimental
8291          this.experimental = TypeConvertor.castToBoolean(value); // BooleanType
8292          return value;
8293        case -1867885268: // subject
8294          this.subject = TypeConvertor.castToType(value); // DataType
8295          return value;
8296        case 3076014: // date
8297          this.date = TypeConvertor.castToDateTime(value); // DateTimeType
8298          return value;
8299        case 1447404028: // publisher
8300          this.publisher = TypeConvertor.castToString(value); // StringType
8301          return value;
8302        case 951526432: // contact
8303          this.getContact().add(TypeConvertor.castToContactDetail(value)); // ContactDetail
8304          return value;
8305        case -1724546052: // description
8306          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
8307          return value;
8308        case -669707736: // useContext
8309          this.getUseContext().add(TypeConvertor.castToUsageContext(value)); // UsageContext
8310          return value;
8311        case -507075711: // jurisdiction
8312          this.getJurisdiction().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
8313          return value;
8314        case -220463842: // purpose
8315          this.purpose = TypeConvertor.castToMarkdown(value); // MarkdownType
8316          return value;
8317        case 111574433: // usage
8318          this.usage = TypeConvertor.castToMarkdown(value); // MarkdownType
8319          return value;
8320        case 1522889671: // copyright
8321          this.copyright = TypeConvertor.castToMarkdown(value); // MarkdownType
8322          return value;
8323        case 765157229: // copyrightLabel
8324          this.copyrightLabel = TypeConvertor.castToString(value); // StringType
8325          return value;
8326        case 223539345: // approvalDate
8327          this.approvalDate = TypeConvertor.castToDate(value); // DateType
8328          return value;
8329        case -1687512484: // lastReviewDate
8330          this.lastReviewDate = TypeConvertor.castToDate(value); // DateType
8331          return value;
8332        case -403934648: // effectivePeriod
8333          this.effectivePeriod = TypeConvertor.castToPeriod(value); // Period
8334          return value;
8335        case 110546223: // topic
8336          this.getTopic().add(TypeConvertor.castToCodeableConcept(value)); // CodeableConcept
8337          return value;
8338        case -1406328437: // author
8339          this.getAuthor().add(TypeConvertor.castToContactDetail(value)); // ContactDetail
8340          return value;
8341        case -1307827859: // editor
8342          this.getEditor().add(TypeConvertor.castToContactDetail(value)); // ContactDetail
8343          return value;
8344        case -261190139: // reviewer
8345          this.getReviewer().add(TypeConvertor.castToContactDetail(value)); // ContactDetail
8346          return value;
8347        case 1740277666: // endorser
8348          this.getEndorser().add(TypeConvertor.castToContactDetail(value)); // ContactDetail
8349          return value;
8350        case 666807069: // relatedArtifact
8351          this.getRelatedArtifact().add(TypeConvertor.castToRelatedArtifact(value)); // RelatedArtifact
8352          return value;
8353        case 166208699: // library
8354          this.getLibrary().add(TypeConvertor.castToCanonical(value)); // CanonicalType
8355          return value;
8356        case 3178259: // goal
8357          this.getGoal().add((PlanDefinitionGoalComponent) value); // PlanDefinitionGoalComponent
8358          return value;
8359        case 92645877: // actor
8360          this.getActor().add((PlanDefinitionActorComponent) value); // PlanDefinitionActorComponent
8361          return value;
8362        case -1422950858: // action
8363          this.getAction().add((PlanDefinitionActionComponent) value); // PlanDefinitionActionComponent
8364          return value;
8365        case -1432923513: // asNeeded
8366          this.asNeeded = TypeConvertor.castToType(value); // DataType
8367          return value;
8368        default: return super.setProperty(hash, name, value);
8369        }
8370
8371      }
8372
8373      @Override
8374      public Base setProperty(String name, Base value) throws FHIRException {
8375        if (name.equals("url")) {
8376          this.url = TypeConvertor.castToUri(value); // UriType
8377        } else if (name.equals("identifier")) {
8378          this.getIdentifier().add(TypeConvertor.castToIdentifier(value));
8379        } else if (name.equals("version")) {
8380          this.version = TypeConvertor.castToString(value); // StringType
8381        } else if (name.equals("versionAlgorithm[x]")) {
8382          this.versionAlgorithm = TypeConvertor.castToType(value); // DataType
8383        } else if (name.equals("name")) {
8384          this.name = TypeConvertor.castToString(value); // StringType
8385        } else if (name.equals("title")) {
8386          this.title = TypeConvertor.castToString(value); // StringType
8387        } else if (name.equals("subtitle")) {
8388          this.subtitle = TypeConvertor.castToString(value); // StringType
8389        } else if (name.equals("type")) {
8390          this.type = TypeConvertor.castToCodeableConcept(value); // CodeableConcept
8391        } else if (name.equals("status")) {
8392          value = new PublicationStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
8393          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
8394        } else if (name.equals("experimental")) {
8395          this.experimental = TypeConvertor.castToBoolean(value); // BooleanType
8396        } else if (name.equals("subject[x]")) {
8397          this.subject = TypeConvertor.castToType(value); // DataType
8398        } else if (name.equals("date")) {
8399          this.date = TypeConvertor.castToDateTime(value); // DateTimeType
8400        } else if (name.equals("publisher")) {
8401          this.publisher = TypeConvertor.castToString(value); // StringType
8402        } else if (name.equals("contact")) {
8403          this.getContact().add(TypeConvertor.castToContactDetail(value));
8404        } else if (name.equals("description")) {
8405          this.description = TypeConvertor.castToMarkdown(value); // MarkdownType
8406        } else if (name.equals("useContext")) {
8407          this.getUseContext().add(TypeConvertor.castToUsageContext(value));
8408        } else if (name.equals("jurisdiction")) {
8409          this.getJurisdiction().add(TypeConvertor.castToCodeableConcept(value));
8410        } else if (name.equals("purpose")) {
8411          this.purpose = TypeConvertor.castToMarkdown(value); // MarkdownType
8412        } else if (name.equals("usage")) {
8413          this.usage = TypeConvertor.castToMarkdown(value); // MarkdownType
8414        } else if (name.equals("copyright")) {
8415          this.copyright = TypeConvertor.castToMarkdown(value); // MarkdownType
8416        } else if (name.equals("copyrightLabel")) {
8417          this.copyrightLabel = TypeConvertor.castToString(value); // StringType
8418        } else if (name.equals("approvalDate")) {
8419          this.approvalDate = TypeConvertor.castToDate(value); // DateType
8420        } else if (name.equals("lastReviewDate")) {
8421          this.lastReviewDate = TypeConvertor.castToDate(value); // DateType
8422        } else if (name.equals("effectivePeriod")) {
8423          this.effectivePeriod = TypeConvertor.castToPeriod(value); // Period
8424        } else if (name.equals("topic")) {
8425          this.getTopic().add(TypeConvertor.castToCodeableConcept(value));
8426        } else if (name.equals("author")) {
8427          this.getAuthor().add(TypeConvertor.castToContactDetail(value));
8428        } else if (name.equals("editor")) {
8429          this.getEditor().add(TypeConvertor.castToContactDetail(value));
8430        } else if (name.equals("reviewer")) {
8431          this.getReviewer().add(TypeConvertor.castToContactDetail(value));
8432        } else if (name.equals("endorser")) {
8433          this.getEndorser().add(TypeConvertor.castToContactDetail(value));
8434        } else if (name.equals("relatedArtifact")) {
8435          this.getRelatedArtifact().add(TypeConvertor.castToRelatedArtifact(value));
8436        } else if (name.equals("library")) {
8437          this.getLibrary().add(TypeConvertor.castToCanonical(value));
8438        } else if (name.equals("goal")) {
8439          this.getGoal().add((PlanDefinitionGoalComponent) value);
8440        } else if (name.equals("actor")) {
8441          this.getActor().add((PlanDefinitionActorComponent) value);
8442        } else if (name.equals("action")) {
8443          this.getAction().add((PlanDefinitionActionComponent) value);
8444        } else if (name.equals("asNeeded[x]")) {
8445          this.asNeeded = TypeConvertor.castToType(value); // DataType
8446        } else
8447          return super.setProperty(name, value);
8448        return value;
8449      }
8450
8451  @Override
8452  public void removeChild(String name, Base value) throws FHIRException {
8453        if (name.equals("url")) {
8454          this.url = null;
8455        } else if (name.equals("identifier")) {
8456          this.getIdentifier().remove(value);
8457        } else if (name.equals("version")) {
8458          this.version = null;
8459        } else if (name.equals("versionAlgorithm[x]")) {
8460          this.versionAlgorithm = null;
8461        } else if (name.equals("name")) {
8462          this.name = null;
8463        } else if (name.equals("title")) {
8464          this.title = null;
8465        } else if (name.equals("subtitle")) {
8466          this.subtitle = null;
8467        } else if (name.equals("type")) {
8468          this.type = null;
8469        } else if (name.equals("status")) {
8470          value = new PublicationStatusEnumFactory().fromType(TypeConvertor.castToCode(value));
8471          this.status = (Enumeration) value; // Enumeration<PublicationStatus>
8472        } else if (name.equals("experimental")) {
8473          this.experimental = null;
8474        } else if (name.equals("subject[x]")) {
8475          this.subject = null;
8476        } else if (name.equals("date")) {
8477          this.date = null;
8478        } else if (name.equals("publisher")) {
8479          this.publisher = null;
8480        } else if (name.equals("contact")) {
8481          this.getContact().remove(value);
8482        } else if (name.equals("description")) {
8483          this.description = null;
8484        } else if (name.equals("useContext")) {
8485          this.getUseContext().remove(value);
8486        } else if (name.equals("jurisdiction")) {
8487          this.getJurisdiction().remove(value);
8488        } else if (name.equals("purpose")) {
8489          this.purpose = null;
8490        } else if (name.equals("usage")) {
8491          this.usage = null;
8492        } else if (name.equals("copyright")) {
8493          this.copyright = null;
8494        } else if (name.equals("copyrightLabel")) {
8495          this.copyrightLabel = null;
8496        } else if (name.equals("approvalDate")) {
8497          this.approvalDate = null;
8498        } else if (name.equals("lastReviewDate")) {
8499          this.lastReviewDate = null;
8500        } else if (name.equals("effectivePeriod")) {
8501          this.effectivePeriod = null;
8502        } else if (name.equals("topic")) {
8503          this.getTopic().remove(value);
8504        } else if (name.equals("author")) {
8505          this.getAuthor().remove(value);
8506        } else if (name.equals("editor")) {
8507          this.getEditor().remove(value);
8508        } else if (name.equals("reviewer")) {
8509          this.getReviewer().remove(value);
8510        } else if (name.equals("endorser")) {
8511          this.getEndorser().remove(value);
8512        } else if (name.equals("relatedArtifact")) {
8513          this.getRelatedArtifact().remove(value);
8514        } else if (name.equals("library")) {
8515          this.getLibrary().remove(value);
8516        } else if (name.equals("goal")) {
8517          this.getGoal().remove((PlanDefinitionGoalComponent) value);
8518        } else if (name.equals("actor")) {
8519          this.getActor().remove((PlanDefinitionActorComponent) value);
8520        } else if (name.equals("action")) {
8521          this.getAction().remove((PlanDefinitionActionComponent) value);
8522        } else if (name.equals("asNeeded[x]")) {
8523          this.asNeeded = null;
8524        } else
8525          super.removeChild(name, value);
8526        
8527      }
8528
8529      @Override
8530      public Base makeProperty(int hash, String name) throws FHIRException {
8531        switch (hash) {
8532        case 116079:  return getUrlElement();
8533        case -1618432855:  return addIdentifier(); 
8534        case 351608024:  return getVersionElement();
8535        case -115699031:  return getVersionAlgorithm();
8536        case 1508158071:  return getVersionAlgorithm();
8537        case 3373707:  return getNameElement();
8538        case 110371416:  return getTitleElement();
8539        case -2060497896:  return getSubtitleElement();
8540        case 3575610:  return getType();
8541        case -892481550:  return getStatusElement();
8542        case -404562712:  return getExperimentalElement();
8543        case -573640748:  return getSubject();
8544        case -1867885268:  return getSubject();
8545        case 3076014:  return getDateElement();
8546        case 1447404028:  return getPublisherElement();
8547        case 951526432:  return addContact(); 
8548        case -1724546052:  return getDescriptionElement();
8549        case -669707736:  return addUseContext(); 
8550        case -507075711:  return addJurisdiction(); 
8551        case -220463842:  return getPurposeElement();
8552        case 111574433:  return getUsageElement();
8553        case 1522889671:  return getCopyrightElement();
8554        case 765157229:  return getCopyrightLabelElement();
8555        case 223539345:  return getApprovalDateElement();
8556        case -1687512484:  return getLastReviewDateElement();
8557        case -403934648:  return getEffectivePeriod();
8558        case 110546223:  return addTopic(); 
8559        case -1406328437:  return addAuthor(); 
8560        case -1307827859:  return addEditor(); 
8561        case -261190139:  return addReviewer(); 
8562        case 1740277666:  return addEndorser(); 
8563        case 666807069:  return addRelatedArtifact(); 
8564        case 166208699:  return addLibraryElement();
8565        case 3178259:  return addGoal(); 
8566        case 92645877:  return addActor(); 
8567        case -1422950858:  return addAction(); 
8568        case -544329575:  return getAsNeeded();
8569        case -1432923513:  return getAsNeeded();
8570        default: return super.makeProperty(hash, name);
8571        }
8572
8573      }
8574
8575      @Override
8576      public String[] getTypesForProperty(int hash, String name) throws FHIRException {
8577        switch (hash) {
8578        case 116079: /*url*/ return new String[] {"uri"};
8579        case -1618432855: /*identifier*/ ret