code: 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;
  	}
docs: 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>.