/**
  * {@inheritDoc}
  */
 public function map(PropertyMetadata $property, $object, $value)
 {
     if (!is_object($object)) {
         throw UnexpectedTypeException::create($object, 'object');
     }
     if (!$property->reflection) {
         $objectReflection = Reflection::loadObjectReflection($object);
         $propertyName = $property->getPropertyName();
         $propertyReflection = $objectReflection->getProperty($propertyName);
         if (!$propertyReflection->isPublic()) {
             $propertyReflection->setAccessible(true);
         }
         $property->reflection = $propertyReflection;
     }
     $property->reflection->setValue($object, $value);
 }
 /**
  * Process for mapping new object
  *
  * @param PropertyMetadata $propertyMetadata
  * @param mixed            $parameters
  * @param string           $group
  * @param array            $paths
  *
  * @return object
  */
 protected function doMapNewObject(PropertyMetadata $propertyMetadata, $parameters, $group, array $paths)
 {
     if (is_object($parameters) && $parameters instanceof \Iterator) {
         $parameters = iterator_to_array($parameters);
     }
     if (!is_array($parameters)) {
         $this->controlInvalidType($paths, $parameters);
     }
     $class = $propertyMetadata->getClass();
     $childObject = $this->createObjectFromClass($class);
     $value = $this->doMap($childObject, $parameters, $group, $paths);
     return $value;
 }