/**
  * {@inheritDoc}
  */
 public function prepareObject(TypeInterface $type, $parent = null)
 {
     $object = parent::prepareObject($type);
     if (null == $parent) {
         throw new RuntimeException('You need a parent to create new objects');
     }
     /** @var $meta \Doctrine\ODM\PHPCR\Mapping\ClassMetadata */
     $meta = $this->om->getClassMetaData(get_class($object));
     if (!property_exists($object, $meta->parentMapping)) {
         throw new RuntimeException('parentMapping need to be mapped to ' . get_class($object));
     }
     $meta->setFieldValue($object, $meta->parentMapping, $parent);
     return $object;
 }
 /**
  * {@inheritDoc}
  *
  * In addition to create the object, try to find the parent relation if one exists.
  */
 public function prepareObject(TypeInterface $type, $parent = null)
 {
     $object = parent::prepareObject($type);
     $config = $type->getConfig();
     $needParent = isset($config['parent_required']) && (bool) $config['parent_required'];
     if (null == $parent) {
         if ($needParent) {
             throw new RuntimeException(sprintf('Parent is required for object of type %s', get_class($object)));
         }
         return $object;
     }
     /** @var ClassMetadata $metaData */
     $metaData = $this->om->getClassMetaData(get_class($object));
     $parentMappingField = $this->findParentMapping($parent, $metaData);
     if (false === $parentMappingField) {
         if ($needParent) {
             throw new RuntimeException(sprintf('No mapping for parent class %s found in metadata of %s', ClassUtils::getClass($parent), $metaData->getName()));
         }
         return $object;
     }
     $metaData->setFieldValue($object, $parentMappingField, $parent);
     return $object;
 }