/**
  * This method generates the class schema object, which is passed to the template
  * it keeps all methods and properties including user modified method bodies and comments
  * needed to create a domain object class file
  *
  * @param Tx_ExtensionBuilder_Domain_Model_DomainObject $domainObject
  * @param boolean mergeWithExistingClass
  *
  * @return Tx_ExtensionBuilder_Domain_Model_Class_Class
  */
 public function generateModelClassObject($domainObject, $mergeWithExistingClass)
 {
     t3lib_div::devlog('------------------------------------- generateModelClassObject(' . $domainObject->getName() . ') ---------------------------------', 'extension_builder', 0);
     $this->classObject = NULL;
     // reference to the resulting class file,
     $className = $domainObject->getClassName();
     if ($mergeWithExistingClass) {
         try {
             $this->classObject = $this->roundTripService->getDomainModelClass($domainObject);
         } catch (Exception $e) {
             t3lib_div::devLog('Class ' . $className . ' could not be imported: ' . $e->getMessage(), 'extension_builder', 2);
         }
     }
     if ($this->classObject == NULL) {
         $this->classObject = new Tx_ExtensionBuilder_Domain_Model_Class_Class($className);
         if ($domainObject->isEntity()) {
             $parentClass = $domainObject->getParentClass();
             if (empty($parentClass)) {
                 $parentClass = $this->configurationManager->getParentClassForEntityObject($this->extension->getExtensionKey());
             }
         } else {
             $parentClass = $this->configurationManager->getParentClassForValueObject($this->extension->getExtensionKey());
         }
         $this->classObject->setParentClass($parentClass);
     }
     if (!$this->classObject->hasDescription()) {
         $this->classObject->setDescription($domainObject->getDescription());
     }
     $this->addInitStorageObjectCalls($domainObject);
     //TODO the following part still needs some enhancement:
     //what should be obligatory in existing properties and methods
     foreach ($domainObject->getProperties() as $domainProperty) {
         $propertyName = $domainProperty->getName();
         // add the property to class Object (or update an existing class Object property)
         if ($this->classObject->propertyExists($propertyName)) {
             $classProperty = $this->classObject->getProperty($propertyName);
             //$classPropertyTags = $classProperty->getTags();
             //t3lib_div::devLog('Property found: ' . $propertyName . ':' . $domainProperty->getTypeForComment(), 'extension_builder', 1, (array)$classProperty);
         } else {
             $classProperty = new Tx_ExtensionBuilder_Domain_Model_Class_Property($propertyName);
             $classProperty->setTag('var', $domainProperty->getTypeForComment());
             $classProperty->addModifier('protected');
             //t3lib_div::devLog('New property: ' . $propertyName . ':' . $domainProperty->getTypeForComment(), 'extension_builder', 1);
         }
         $classProperty->setAssociatedDomainObjectProperty($domainProperty);
         if ($domainProperty->getRequired()) {
             if (!$classProperty->isTaggedWith('validate')) {
                 $validateTag = explode(' ', trim($domainProperty->getValidateAnnotation()));
                 $classProperty->setTag('validate', $validateTag[1]);
             }
         }
         if ($domainProperty->isRelation() && $domainProperty->getLazyLoading()) {
             if (!$classProperty->isTaggedWith('lazy')) {
                 $classProperty->setTag('lazy', '');
             }
         }
         if ($domainProperty->getHasDefaultValue()) {
             $classProperty->setDefault($domainProperty->getDefaultValue());
         }
         $this->classObject->setProperty($classProperty);
         if ($domainProperty->isNew()) {
             $this->setPropertyRelatedMethods($domainProperty);
         }
     }
     //t3lib_div::devlog('Methods before sorting','extension_builder',0,array_keys($this->classObject->getMethods()));
     //$this->sortMethods($domainObject);
     return $this->classObject;
 }