/**
  * Converts document or (nested) object to an array.
  *
  * @param ObjectInterface $object             A document or a (nested) object
  * @param array           $propertiesMetadata
  *
  * @return array
  */
 public function convertToArray(ObjectInterface $object, $propertiesMetadata = [])
 {
     if (empty($propertiesMetadata)) {
         $propertiesMetadata = $this->metadataCollector->getObjectPropertiesMetadata(get_class($object));
     }
     $array = [];
     foreach ($propertiesMetadata as $name => $propertyMetadata) {
         if ($propertyMetadata['propertyAccess'] == DocumentMetadata::PROPERTY_ACCESS_PRIVATE) {
             $value = $object->{$propertyMetadata['methods']['getter']}();
         } else {
             $value = $object->{$propertyMetadata['propertyName']};
         }
         if (isset($value)) {
             // If this is a (nested) object or a list of such
             if (array_key_exists('propertiesMetadata', $propertyMetadata)) {
                 $new = [];
                 if ($propertyMetadata['multiple']) {
                     // Verify value is traversable
                     if (!(is_array($value) || is_object($value) && $value instanceof \Traversable)) {
                         throw new \InvalidArgumentException(sprintf('Value of "%s" is not traversable, although field is set to "multiple"'));
                     }
                     foreach ($value as $item) {
                         $this->checkObjectType($item, $propertyMetadata['className']);
                         $new[] = $this->convertToArray($item, $propertyMetadata['propertiesMetadata']);
                     }
                 } else {
                     $this->checkObjectType($value, $propertyMetadata['className']);
                     $new = $this->convertToArray($value, $propertyMetadata['propertiesMetadata']);
                 }
                 $array[$name] = $new;
             } elseif ($value instanceof MLProperty) {
                 foreach ($value->getValues() as $language => $langValue) {
                     $array[$name . $this->languageSeparator . $language] = $langValue;
                 }
             } else {
                 $array[$name] = $value;
             }
         }
     }
     return $array;
 }