protected <T> T performCopy(final MultiTenantCopyContext context, final MultiTenantCloneable<T> entity, Map<String, String> copyHints, final EntityDuplicateModifier... modifiers) throws Exception {
context.getCopyHints().putAll(copyHints);
context.setForDuplicate(true);
persistCopyObjectTree(new CopyOperation<T, CloneNotSupportedException>() {
@Override
public T execute(T original) throws CloneNotSupportedException {
T response = entity.createOrRetrieveCopyInstance(context).getClone();
for (EntityDuplicateModifier modifier : modifiers) {
modifier.modifyInitialDuplicateState(response);
}
return response;
}
}, (Class<T>) entity.getClass(), (T) entity, context);
return context.getClonedVersion((Class<T>) entity.getClass(), genericEntityService.getIdentifier(entity));
}
}