public function visitProperty(PropertyMetadata $metadata, $data, Context $context)
 {
     $name = $this->namingStrategy->translateName($metadata);
     $types = array('NULL', 'string', 'integer', 'boolean', 'double', 'float', 'array', 'ArrayCollection');
     if (isset($data[$name]) && is_scalar($data[$name]) && !in_array($metadata->type['name'], $types)) {
         /** @var DeserializationContext $context */
         $context->useDoctrineConstructor();
         $data[$name] = array('id' => $data[$name]);
     }
     if (null === $data || is_array($data) && !array_key_exists($name, $data)) {
         return;
     }
     if (!$metadata->type) {
         throw new RuntimeException(sprintf('You must define a type for %s::$%s.', $metadata->reflection->class, $metadata->name));
     }
     $v = $data[$name] !== null ? $this->getNavigator()->accept($data[$name], $metadata->type, $context) : null;
     if (null === $metadata->setter) {
         $metadata->reflection->setValue($this->getCurrentObject(), $v);
         return;
     }
     $this->getCurrentObject()->{$metadata->setter}($v);
 }