commit 402ef73e105dc927a08dd718bc382d930b693837
Author: Christian Ehringfeld <c.ehringfeld@t-online.de>
Date:   Mon Oct 12 22:21:22 2015 +0200

    entity copy method, not fully tested

diff --git a/samples/example/main.cpp b/samples/example/main.cpp
index d299989..d435163 100644
--- a/samples/example/main.cpp
+++ b/samples/example/main.cpp
@@ -133,7 +133,6 @@ qDebug() << "EntityManagerObjectName:" << e->objectName();
     qWarning() << groupFindPtr->toString();
     QSharedPointer<Entity> entityGroupFindPtr = groupFindPtr.objectCast<Entity>();
     e->save(entityGroupFindPtr, true);
-
     qWarning() << "-----------------------------";
     qWarning() << "Remove Group";
     qWarning() << "-----------------------------";
diff --git a/src/entity.cpp b/src/entity.cpp
index e7914cc..45fcf44 100644
--- a/src/entity.cpp
+++ b/src/entity.cpp
@@ -50,6 +50,10 @@ QString Entity::toString() const {
     return r;
 }
 
+Entity *Entity::copy() const {
+    return EntityHelper::copyObject(this);
+}
+
 QString Entity::slimToString() const {
     QString r = "";
     r.append(EntityHelper::getClassName(this));
diff --git a/src/entity.h b/src/entity.h
index f38dd04..ef0c9bd 100644
--- a/src/entity.h
+++ b/src/entity.h
@@ -18,9 +18,8 @@
 #define ENTITY_H
 #include <QObject>
 #include <QSharedPointer>
-#include "relation.h"
 #include <QStringList>
-#include "entityinstancefactory.h"
+#include "relation.h"
 #include "validators/validatorrule.h"
 #include "validators/errormsg.h"
 namespace CuteEntityManager {
@@ -29,15 +28,24 @@ namespace CuteEntityManager {
  * You must not name any persisted property objectName, because its pre used by Qt and will be ignored by Entity Manager
  * @brief The Entity class
  */
+class ValidationRule;
+class ErrorMsg;
 class Entity : public QObject {
     Q_OBJECT
     Q_PROPERTY(qint64 id READ getId WRITE setId NOTIFY idChanged)
 
-  signals:
+signals:
     void idChanged();
 
-  public:
+public:
     virtual QString toString() const;
+    /**
+     * @brief copy
+     * depends on Q_PROPERTIES
+     * Copies them with exceptions of primary key(mostly "id") and objectName
+     * @return
+     */
+    virtual Entity* copy() const;
     virtual ~Entity();
     virtual QList<ValidationRule> validationRules() const;
     virtual QString getTablename() const;
@@ -60,7 +68,7 @@ class Entity : public QObject {
     QString getErrorsAsString() const;
     void setErrors(const QList<ErrorMsg> &value);
 
-  protected:
+protected:
     explicit Entity (QObject *parent = 0);
     virtual QString slimToString() const;
     QList<ErrorMsg> errors;
diff --git a/src/entityhelper.cpp b/src/entityhelper.cpp
index c7d0db2..0666a22 100644
--- a/src/entityhelper.cpp
+++ b/src/entityhelper.cpp
@@ -24,7 +24,7 @@ EntityHelper::EntityHelper() {
 }
 
 const QHash<QString, Relation> EntityHelper::getNonInheritedRelations(
-    const Entity *entity) {
+        const Entity *entity) {
     auto relations = entity->getRelations();
     auto superObject = EntityInstanceFactory::newSuperClassInstance(entity);
     if (superObject) {
@@ -43,14 +43,14 @@ const QHash<QString, Relation> EntityHelper::getNonInheritedRelations(
 }
 
 const QList<const QMetaObject *> EntityHelper::superClasses(
-    const Entity *entity, bool
-    stopAtSingleTableInheritance) {
+        const Entity *entity, bool
+        stopAtSingleTableInheritance) {
     QList<const QMetaObject *> classes = QList<const QMetaObject *>();
     auto superMetaObject = entity->metaObject()->superClass();
     if (entity->getInheritanceStrategy() == InheritanceStrategy::JOINED_TABLE) {
         Entity *e = nullptr;
         while (superMetaObject && QString(superMetaObject->className()) !=
-                QString("CuteEntityManager::Entity")) {
+               QString("CuteEntityManager::Entity")) {
             e = EntityInstanceFactory::createInstance(superMetaObject->className());
             if (e) {
                 classes.append(superMetaObject);
@@ -70,12 +70,12 @@ const QList<const QMetaObject *> EntityHelper::superClasses(
 }
 
 const QHash<QString, QMetaProperty> EntityHelper::getMetaProperties(
-    const Entity *entity) {
+        const Entity *entity) {
     return EntityHelper::getMetaProperties(entity->metaObject());
 }
 
 const QHash<QString, QMetaProperty> EntityHelper::getSuperMetaProperties(
-    const Entity *entity) {
+        const Entity *entity) {
     auto superMetaObjectPropertyMap = QHash<QString, QMetaProperty>();
     auto superMeta = entity->metaObject()->superClass();
     if (QString(superMeta->className()) != QString("CuteEntityManager::Entity")
@@ -91,7 +91,7 @@ const QHash<QString, QMetaProperty> EntityHelper::getSuperMetaProperties(
 }
 
 const QHash<QString, QMetaProperty> EntityHelper::getMetaProperties(
-    const QMetaObject *object) {
+        const QMetaObject *object) {
     auto h = QHash<QString, QMetaProperty>();
     for (int var = 0; var < object->propertyCount(); ++var) {
         QMetaProperty m = object->property(var);
@@ -103,13 +103,13 @@ const QHash<QString, QMetaProperty> EntityHelper::getMetaProperties(
 }
 
 const QHash<QString, QMetaProperty> EntityHelper::getNonInheritedMetaProperties(
-    const Entity *entity) {
+        const Entity *entity) {
     auto props = EntityHelper::getMetaProperties(entity);
     auto superObject = EntityInstanceFactory::newSuperClassInstance(entity);
     if (superObject) {
         auto superProps = EntityHelper::getMetaProperties(superObject);
         for (auto iterator = superProps.constBegin(); iterator != superProps.constEnd();
-                ++iterator) {
+             ++iterator) {
             if (props.contains(iterator.key())) {
                 props.remove(iterator.key());
             }
@@ -121,7 +121,7 @@ const QHash<QString, QMetaProperty> EntityHelper::getNonInheritedMetaProperties(
 }
 
 const QHash<QString, QMetaProperty> EntityHelper::getInheritedMetaProperties(
-    const Entity *entity) {
+        const Entity *entity) {
     auto props = EntityHelper::getMetaProperties(entity);
     auto superObject = EntityInstanceFactory::newSuperClassInstance(entity);
     auto wholeProperties = QHash<QString, QMetaProperty>();
@@ -142,7 +142,7 @@ const QHash<QString, QMetaProperty> EntityHelper::getInheritedMetaProperties(
 }
 
 const QHash<Relation, QMetaProperty> EntityHelper::getRelationProperties(
-    const Entity *entity) {
+        const Entity *entity) {
     auto h = QHash<Relation, QMetaProperty>();
     auto relations = entity->getRelations();
     for (int var = 0; var < entity->metaObject()->propertyCount(); ++var) {
@@ -154,6 +154,22 @@ const QHash<Relation, QMetaProperty> EntityHelper::getRelationProperties(
     return h;
 }
 
+Entity *EntityHelper::copyObject(const Entity *entity)
+{
+    auto metaObject = entity->metaObject();
+    auto newInstance = EntityInstanceFactory::createInstance(metaObject);
+    if(newInstance) {
+        for (int i = 0; i < metaObject->propertyCount(); ++i) {
+            auto property = metaObject->property(i);
+            QString name = property.name();
+            if(property.isValid() && name != QString("objectName") && name !=entity->getPrimaryKey()) {
+                property.write(newInstance,property.read(entity));
+            }
+        }
+    }
+    return newInstance;
+}
+
 const char *EntityHelper::getClassname(const Entity *entity) {
     return entity->metaObject()->className();
 }
@@ -171,7 +187,7 @@ void EntityHelper::setListProperty(const QSharedPointer<Entity> &entity,
 }
 
 void EntityHelper::addEntityToListProperty(const QSharedPointer<Entity>
-        &entity, QSharedPointer<Entity> add, const QMetaProperty &property) {
+                                           &entity, QSharedPointer<Entity> add, const QMetaProperty &property) {
     QVariant var = property.read(entity.data());
     if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
         auto list = EntityInstanceFactory::castQVariantList(var);
@@ -183,7 +199,7 @@ void EntityHelper::addEntityToListProperty(const QSharedPointer<Entity>
 }
 
 void EntityHelper::removeEntityFromListProperty(const QSharedPointer<Entity>
-        &entity, QSharedPointer<Entity> remove, const QMetaProperty &property) {
+                                                &entity, QSharedPointer<Entity> remove, const QMetaProperty &property) {
     QVariant var = property.read(entity.data());
     if (!var.isNull() && var.canConvert<QList<QVariant>>()) {
         auto list = EntityInstanceFactory::castQVariantList(var);
@@ -220,7 +236,7 @@ void EntityHelper::setProperty(const QSharedPointer<Entity> &entity,
 }
 
 QMetaProperty EntityHelper::mappedProperty(const Relation &r,
-        const QSharedPointer<Entity> &foreignEntity) {
+                                           const QSharedPointer<Entity> &foreignEntity) {
     QMetaProperty prop;
     auto props = EntityHelper::getMetaProperties(foreignEntity.data());
     if (!r.getMappedBy().isEmpty() && props.contains(r.getMappedBy())) {
@@ -228,7 +244,7 @@ QMetaProperty EntityHelper::mappedProperty(const Relation &r,
     } else {
         auto relations = foreignEntity->getRelations();
         for (auto iterator = relations.constBegin(); iterator != relations.constEnd();
-                ++iterator) {
+             ++iterator) {
             auto rel = iterator.value();
             if (rel.getMappedBy() == r.getPropertyName()) {
                 prop = props.value(rel.getPropertyName());
@@ -240,9 +256,9 @@ QMetaProperty EntityHelper::mappedProperty(const Relation &r,
 }
 
 QHash<QString, QVariant> EntityHelper::getEntityAttributes(
-    const QHash<QString, QMetaProperty>
-    &props,
-    const QSharedPointer<Entity> &entity) {
+        const QHash<QString, QMetaProperty>
+        &props,
+        const QSharedPointer<Entity> &entity) {
     auto map = QHash<QString, QVariant>();
     auto transientAttrs = entity->getTransientAttributes();
     auto relations = entity->getRelations();
diff --git a/src/entityhelper.h b/src/entityhelper.h
index a86483d..fe74caf 100644
--- a/src/entityhelper.h
+++ b/src/entityhelper.h
@@ -42,6 +42,8 @@ class EntityHelper {
         const Entity *entity);
     static const QHash<Relation, QMetaProperty> getRelationProperties(
         const Entity *entity);
+    static Entity* copyObject(const Entity*entity);
+
 
     static const char *getClassname(const Entity *entity);
     static const QString getClassName(const Entity *entity);
diff --git a/tests/models.h b/tests/models.h
index 2e54836..e0bec0a 100644
--- a/tests/models.h
+++ b/tests/models.h
@@ -26,9 +26,7 @@ class Person: public Entity {
 
   public:
     enum class Gender {MALE, FEMALE, UNKNOWNGENDER};
-    Q_ENUM(Gender);
     enum class NameOrder {FIRST_FAMILY_NAME_ORDER, FAMILY_FIRST_NAME_ORDER};
-    Q_ENUM(NameOrder);
     Q_INVOKABLE explicit Person(QObject *parent = 0);
     Person(QString firstName, QString familyName,
            Gender gender = Gender::UNKNOWNGENDER,
