/**
  * {@inheritDoc}
  */
 public function loadMetadata($class)
 {
     if (is_object($class)) {
         $class = get_class($class);
     }
     $key = 'model_transformer.annotated:' . $class;
     $metadata = $this->cache->get($key);
     if (null === $metadata) {
         $metadata = $this->delegate->loadMetadata($class);
         $this->cache->set($key, $metadata);
     }
     return $metadata;
 }
 /**
  * {@inheritDoc}
  */
 public function transform($object, ContextInterface $context)
 {
     $metadata = $this->metadataFactory->loadMetadata(get_class($object));
     // Get properties for transformation
     if (!$context->getGroups()) {
         $transformProperties = $metadata->getProperties();
     } else {
         $transformProperties = $metadata->getPropertiesForGroups($context->getGroups());
     }
     // Try create transformed
     $transformedClass = $metadata->getTransformedClass();
     $transformedReflection = Reflection::loadClassReflection($transformedClass);
     $transformed = $transformedReflection->newInstanceWithoutConstructor();
     $objectReflection = Reflection::loadClassReflection($object);
     foreach ($transformProperties as $transformPropertyName => $propertyMetadata) {
         try {
             $objectPropertyReflection = $objectReflection->getProperty($transformPropertyName);
         } catch (\ReflectionException $e) {
             throw new \RuntimeException(sprintf('Error transform property: Not found property "%s" in class "%s".', $transformPropertyName, $objectReflection->getName()), 0, $e);
         }
         try {
             $transformedPropertyReflection = $transformedReflection->getProperty($propertyMetadata->getPropertyName());
         } catch (\ReflectionException $e) {
             throw new \RuntimeException(sprintf('Error transform property: Not found property "%s" in class "%s".', $propertyMetadata->getPropertyName(), $transformedReflection->getName()));
         }
         if (!$transformedPropertyReflection->isPublic()) {
             $transformedPropertyReflection->setAccessible(true);
         }
         if (!$objectPropertyReflection->isPublic()) {
             $objectPropertyReflection->setAccessible(true);
         }
         $objectPropertyValue = $objectPropertyReflection->getValue($object);
         $transformedValue = $this->transformValue($object, $objectPropertyValue, $propertyMetadata, $transformedPropertyReflection);
         $transformedPropertyReflection->setValue($transformed, $transformedValue);
     }
     return $transformed;
 }