<p>It's a bit difficult to implement a deep object copy function. What steps you take to ensure the original object and the cloned one share no reference? </p>

A safe way is to serialize the object, then deserialize.  This ensures everything is a brand new reference.
Here's an article
about how to do this efficiently.
Caveats: It's possible for classes to override serialization such that new instances are
not
created, e.g. for singletons.  Also this of course doesn't work if your classes aren't Serializable.