/**
  * {@inheritdoc}
  */
 public function dump(array $exclude = [])
 {
     $array = array_diff_key(array_filter(get_object_vars($this), function ($value) {
         return $value || is_bool($value);
     }), array_flip(array_merge(['name', 'objectName', 'multiple'], $exclude)));
     return array_combine(array_map(function ($key) {
         return Caser::snake($key);
     }, array_keys($array)), array_values($array));
 }
 /**
  * Finds aliases for every property used in document including parent classes.
  *
  * @param \ReflectionClass $reflectionClass
  *
  * @return array
  */
 private function getAliases(\ReflectionClass $reflectionClass)
 {
     $reflectionName = $reflectionClass->getName();
     if (array_key_exists($reflectionName, $this->aliases)) {
         return $this->aliases[$reflectionName];
     }
     $alias = [];
     /** @var \ReflectionProperty[] $properties */
     $properties = $this->getDocumentPropertiesReflection($reflectionClass);
     foreach ($properties as $name => $property) {
         $type = $this->getPropertyAnnotationData($property);
         if ($type !== null) {
             $alias[$type->name] = ['propertyName' => $name, 'type' => $type->type];
             switch (true) {
                 case $property->isPublic():
                     $propertyType = 'public';
                     break;
                 case $property->isProtected():
                 case $property->isPrivate():
                     $propertyType = 'private';
                     $camelCaseName = ucfirst(Caser::camel($name));
                     if ($reflectionClass->hasMethod('get' . $camelCaseName) && $reflectionClass->hasMethod('set' . $camelCaseName)) {
                         $alias[$type->name]['methods'] = ['getter' => 'get' . $camelCaseName, 'setter' => 'set' . $camelCaseName];
                     } else {
                         $message = sprintf('Missing %s() method in %s class. Add it, or change property to public.', $name, $reflectionName);
                         throw new \LogicException($message);
                     }
                     break;
                 default:
                     $message = sprintf('Wrong property %s type of %s class types cannot ' . 'be static or abstract.', $name, $reflectionName);
                     throw new \LogicException($message);
             }
             $alias[$type->name]['propertyType'] = $propertyType;
             if ($type->objectName) {
                 $child = new \ReflectionClass($this->finder->getNamespace($type->objectName));
                 $alias[$type->name] = array_merge($alias[$type->name], ['multiple' => $type instanceof Property ? $type->multiple : false, 'aliases' => $this->getAliases($child), 'namespace' => $child->getName()]);
             }
         }
     }
     $this->aliases[$reflectionName] = $alias;
     return $this->aliases[$reflectionName];
 }
 /**
  * Checks if class have setter and getter, and returns them in array.
  *
  * @param \ReflectionClass $reflectionClass
  * @param string           $property
  *
  * @return array
  */
 private function getMutatorMethods(\ReflectionClass $reflectionClass, $property, $propertyType)
 {
     $camelCaseName = ucfirst(Caser::camel($property));
     $setterName = 'set' . $camelCaseName;
     if (!$reflectionClass->hasMethod($setterName)) {
         $message = sprintf('Missing %s() method in %s class. Add it, or change property to public.', $setterName, $reflectionClass->getName());
         throw new \LogicException($message);
     }
     if ($reflectionClass->hasMethod('get' . $camelCaseName)) {
         return ['getter' => 'get' . $camelCaseName, 'setter' => $setterName];
     }
     if ($propertyType === 'boolean') {
         if ($reflectionClass->hasMethod('is' . $camelCaseName)) {
             return ['getter' => 'is' . $camelCaseName, 'setter' => $setterName];
         }
         $message = sprintf('Missing %s() or %s() method in %s class. Add it, or change property to public.', 'get' . $camelCaseName, 'is' . $camelCaseName, $reflectionClass->getName());
         throw new \LogicException($message);
     }
     $message = sprintf('Missing %s() method in %s class. Add it, or change property to public.', 'get' . $camelCaseName, $reflectionClass->getName());
     throw new \LogicException($message);
 }