/**
  * {@inheritdoc}
  */
 public function getMetadataFor($value)
 {
     $class = $this->getClass($value);
     if (!$class) {
         throw new InvalidArgumentException(sprintf('Cannot create metadata for non-objects. Got: "%s"', gettype($value)));
     }
     if (isset($this->loadedClasses[$class])) {
         return $this->loadedClasses[$class];
     }
     if ($this->cache && ($this->loadedClasses[$class] = $this->cache->fetch($class))) {
         return $this->loadedClasses[$class];
     }
     if (!class_exists($class) && !interface_exists($class)) {
         throw new InvalidArgumentException(sprintf('The class or interface "%s" does not exist.', $class));
     }
     $classMetadata = new ClassMetadata($class);
     $this->loader->loadClassMetadata($classMetadata);
     $reflectionClass = $classMetadata->getReflectionClass();
     // Include metadata from the parent class
     if ($parent = $reflectionClass->getParentClass()) {
         $classMetadata->merge($this->getMetadataFor($parent->name));
     }
     // Include metadata from all implemented interfaces
     foreach ($reflectionClass->getInterfaces() as $interface) {
         $classMetadata->merge($this->getMetadataFor($interface->name));
     }
     if ($this->cache) {
         $this->cache->save($class, $classMetadata);
     }
     return $this->loadedClasses[$class] = $classMetadata;
 }
 /**
  * {@inheritdoc}
  */
 public function getMetadataFor($value)
 {
     $class = $this->getClass($value);
     if (isset($this->loadedClasses[$class])) {
         return $this->loadedClasses[$class];
     }
     if ($this->cache && ($this->loadedClasses[$class] = $this->cache->fetch($class))) {
         return $this->loadedClasses[$class];
     }
     $classMetadata = new ClassMetadata($class);
     $this->loader->loadClassMetadata($classMetadata);
     $reflectionClass = $classMetadata->getReflectionClass();
     // Include metadata from the parent class
     if ($parent = $reflectionClass->getParentClass()) {
         $classMetadata->merge($this->getMetadataFor($parent->name));
     }
     // Include metadata from all implemented interfaces
     foreach ($reflectionClass->getInterfaces() as $interface) {
         $classMetadata->merge($this->getMetadataFor($interface->name));
     }
     if ($this->cache) {
         $this->cache->save($class, $classMetadata);
     }
     return $this->loadedClasses[$class] = $classMetadata;
 }