protected <T extends EObject> T cloneAndAssociate(T original) {
		final boolean canAssociate = languageInfo.isLanguage(original.eResource());
		EcoreUtil.Copier copier = new EcoreUtil.Copier(false) {
			private static final long serialVersionUID = 1L;

			@Override/* @Nullable */ 
			protected EObject createCopy(/* @Nullable */ EObject eObject) {
				EObject result = super.createCopy(eObject);
				if (canAssociate && result != null && eObject != null && !eObject.eIsProxy()) {
					associator.associate(eObject, result);
				}
				return result;
			}
		};
		@SuppressWarnings("unchecked")
		T copy = (T) copier.copy(original);
		copier.copyReferences();
		return copy;
	}
protected < T extends EObject > T cloneAndAssociate ( T original ) { final boolean canAssociate = languageInfo . isLanguage ( original . eResource ( ) ) ; EcoreUtil . Copier copier = new EcoreUtil . Copier ( false ) { private static final long serialVersionUID = 1L ; @ Override protected EObject createCopy ( EObject eObject ) { EObject result = super . createCopy ( eObject ) ; if ( canAssociate && result != null && eObject != null && ! eObject . eIsProxy ( ) ) { associator . associate ( eObject , result ) ; } return result ; } } ; @ SuppressWarnings ( "unchecked" ) T copy = ( T ) copier . copy ( original ) ; copier . copyReferences ( ) ; return copy ; }
Creates a deep copy of the given object and associates each copied instance with the
clone. Does not resolve any proxies.

@param original the root element to be cloned.
@return a clone of tree rooted in original associated with the original, <code>null</code> if original is <code>null</code>.