private DatasetField copy(Object version, DatasetFieldCompoundValue parent) {
    DatasetField dsf = new DatasetField();
    dsf.setDatasetFieldType(datasetFieldType);

    if (version != null) {
      if (version.getClass().getName().equals("edu.harvard.iq.dataverse.DatasetVersion")) {
        dsf.setDatasetVersion((DatasetVersion) version);
      } else {
        dsf.setTemplate((Template) version);
      }
    }

    dsf.setParentDatasetFieldCompoundValue(parent);
    dsf.setControlledVocabularyValues(controlledVocabularyValues);

    for (DatasetFieldValue dsfv : datasetFieldValues) {
      dsf.getDatasetFieldValues().add(dsfv.copy(dsf));
    }

    for (DatasetFieldCompoundValue compoundValue : datasetFieldCompoundValues) {
      dsf.getDatasetFieldCompoundValues().add(compoundValue.copy(dsf));
    }

    return dsf;
  }
  public static DatasetField createNewEmptyDatasetField(DatasetFieldType dsfType, Object dsv) {

    DatasetField dsfv = createNewEmptyDatasetField(dsfType);
    // TODO - a better way to handle this?
    if (dsv.getClass().getName().equals("edu.harvard.iq.dataverse.DatasetVersion")) {
      dsfv.setDatasetVersion((DatasetVersion) dsv);
    } else {
      dsfv.setTemplate((Template) dsv);
    }

    return dsfv;
  }