public PhylogenyData copy() {
        final NodeData new_pnd = new NodeData();
        if ( isHasSequence() ) {
            new_pnd.setSequence( ( Sequence ) getSequence().copy() );
        }
        if ( isHasEvent() ) {
            new_pnd.setEvent( ( Event ) getEvent().copy() );
        }
        if ( isHasNodeIdentifier() ) {
            new_pnd.setNodeIdentifier( ( Identifier ) getNodeIdentifier().copy() );
        }
        if ( isHasTaxonomy() ) {
            new_pnd.setTaxonomy( ( Taxonomy ) getTaxonomy().copy() );
        }
        if ( isHasBinaryCharacters() ) {
            new_pnd.setBinaryCharacters( ( BinaryCharacters ) getBinaryCharacters().copy() );
        }
        if ( isHasReference() ) {
            new_pnd.setReference( ( Reference ) getReference().copy() );
        }
        if ( isHasDistribution() ) {
            new_pnd.setDistribution( ( Distribution ) getDistribution().copy() );
        }
        if ( isHasDate() ) {
            new_pnd.setDate( ( Date ) getDate().copy() );
        }
        if ( isHasProperties() ) {
            new_pnd.setProperties( ( PropertiesMap ) getProperties().copy() );
        }
        return new_pnd;
    }