public Object copyTo(ObjectLocator locator, Object target, CopyStrategy strategy) {
   if (null == target) {
     throw new IllegalArgumentException(
         "Target argument must not be null for abstract copyable classes.");
   }
   super.copyTo(locator, target, strategy);
   if (target instanceof AbstractCoordinateOperationType) {
     final AbstractCoordinateOperationType copy = ((AbstractCoordinateOperationType) target);
     if (this.isSetDomainOfValidity()) {
       DomainOfValidityElement sourceDomainOfValidity;
       sourceDomainOfValidity = this.getDomainOfValidity();
       DomainOfValidityElement copyDomainOfValidity =
           ((DomainOfValidityElement)
               strategy.copy(
                   LocatorUtils.property(locator, "domainOfValidity", sourceDomainOfValidity),
                   sourceDomainOfValidity));
       copy.setDomainOfValidity(copyDomainOfValidity);
     } else {
       copy.domainOfValidity = null;
     }
     if (this.isSetScope()) {
       List<String> sourceScope;
       sourceScope = this.getScope();
       @SuppressWarnings("unchecked")
       List<String> copyScope =
           ((List<String>)
               strategy.copy(LocatorUtils.property(locator, "scope", sourceScope), sourceScope));
       copy.unsetScope();
       List<String> uniqueScopel = copy.getScope();
       uniqueScopel.addAll(copyScope);
     } else {
       copy.unsetScope();
     }
     if (this.isSetOperationVersion()) {
       String sourceOperationVersion;
       sourceOperationVersion = this.getOperationVersion();
       String copyOperationVersion =
           ((String)
               strategy.copy(
                   LocatorUtils.property(locator, "operationVersion", sourceOperationVersion),
                   sourceOperationVersion));
       copy.setOperationVersion(copyOperationVersion);
     } else {
       copy.operationVersion = null;
     }
     if (this.isSetCoordinateOperationAccuracy()) {
       List<CoordinateOperationAccuracyElement> sourceCoordinateOperationAccuracy;
       sourceCoordinateOperationAccuracy = this.getCoordinateOperationAccuracy();
       @SuppressWarnings("unchecked")
       List<CoordinateOperationAccuracyElement> copyCoordinateOperationAccuracy =
           ((List<CoordinateOperationAccuracyElement>)
               strategy.copy(
                   LocatorUtils.property(
                       locator, "coordinateOperationAccuracy", sourceCoordinateOperationAccuracy),
                   sourceCoordinateOperationAccuracy));
       copy.unsetCoordinateOperationAccuracy();
       List<CoordinateOperationAccuracyElement> uniqueCoordinateOperationAccuracyl =
           copy.getCoordinateOperationAccuracy();
       uniqueCoordinateOperationAccuracyl.addAll(copyCoordinateOperationAccuracy);
     } else {
       copy.unsetCoordinateOperationAccuracy();
     }
     if (this.isSetSourceCRS()) {
       CRSPropertyType sourceSourceCRS;
       sourceSourceCRS = this.getSourceCRS();
       CRSPropertyType copySourceCRS =
           ((CRSPropertyType)
               strategy.copy(
                   LocatorUtils.property(locator, "sourceCRS", sourceSourceCRS), sourceSourceCRS));
       copy.setSourceCRS(copySourceCRS);
     } else {
       copy.sourceCRS = null;
     }
     if (this.isSetTargetCRS()) {
       CRSPropertyType sourceTargetCRS;
       sourceTargetCRS = this.getTargetCRS();
       CRSPropertyType copyTargetCRS =
           ((CRSPropertyType)
               strategy.copy(
                   LocatorUtils.property(locator, "targetCRS", sourceTargetCRS), sourceTargetCRS));
       copy.setTargetCRS(copyTargetCRS);
     } else {
       copy.targetCRS = null;
     }
   }
   return target;
 }