/**
  * @return ReflectionMethodMagic[]|array
  */
 public function extractFromClass(ReflectionClass $reflectionClass)
 {
     $methods = [];
     if ($parentClass = $reflectionClass->getParentClass()) {
         $methods += $this->extractFromParentClass($parentClass, $reflectionClass->isDocumented());
     }
     if ($traits = $reflectionClass->getTraits()) {
         $methods += $this->extractFromTraits($traits, $reflectionClass->isDocumented());
     }
     return $methods;
 }
 /**
  * @return array {[ declaringTraitName => ReflectionPropertyMagic[] ]}
  */
 public function getUsedMagicProperties()
 {
     $properties = [];
     $allProperties = array_flip(array_map(function (ReflectionProperty $property) {
         return $property->getName();
     }, $this->getOwnMagicProperties()));
     foreach ($this->reflectionClass->getTraits() as $trait) {
         if (!$trait instanceof ReflectionClass) {
             continue;
         }
         $usedProperties = $this->getUsedElements($trait->getOwnMagicProperties(), $allProperties);
         $properties = $this->sortElements($usedProperties, $properties, $trait);
     }
     return $properties;
 }
 /**
  * @return array {[ traitName => ReflectionProperty[] ]}
  */
 public function getUsedProperties()
 {
     $allProperties = array_flip(array_map(function (ReflectionProperty $property) {
         return $property->getName();
     }, $this->reflectionClass->getOwnProperties()));
     $properties = [];
     foreach ($this->reflectionClass->getTraits() as $trait) {
         if (!$trait instanceof ReflectionClass) {
             continue;
         }
         $usedProperties = [];
         foreach ($trait->getOwnProperties() as $property) {
             if (!array_key_exists($property->getName(), $allProperties)) {
                 $usedProperties[$property->getName()] = $property;
                 $allProperties[$property->getName()] = NULL;
             }
         }
         if (!empty($usedProperties)) {
             ksort($usedProperties);
             $properties[$trait->getName()] = array_values($usedProperties);
         }
     }
     return $properties;
 }