If you wish to clone an object derived from ReferenceTarget you must use RemapDir::CloneRef() or ::CloneRefHierarchy() instead of ReferenceTarget::Clone(). This will correctly perform backpatching of references in the reference hierarchy. If backpatching is not performed, a reference graph can keep references to the original object, instead of to the copied object.
ReferenceTarget* Clone(ReferenceTarget* aTarget) { return CloneRefHierarchy(aTarget); } };
In some cases you may need to clone a group of references, in which case you would need to use an instance of RemapDir. The following code demonstrates such a scenario:
PRSControl& PRSControl::operator=(const PRSControl& ctrl) {
RemapDir *remap = NewRemapDir();
ReplaceReference(PRS_POS_REF,remap->CloneRef(ctrl.pos));
ReplaceReference(PRS_ROT_REF,remap->CloneRef(ctrl.rot));
ReplaceReference(PRS_SCL_REF,remap->CloneRef(ctrl.scl));
// Make sure that if any sub-controller references this
// controller that it will get backpatched correctly
remap->AddEntry(ctrl,this);
remap->DeleteThis();
mLocked = ctrl.mLocked;
return(*this);
}