public function testExtractTwiceGivenSameEntityShouldProcessExtractionOnceAndReturnSameData()
 {
     $entity = new TestAsset\Entity('foo', 'Foo Bar');
     $entityHydratorManager = $this->getMockBuilder('ZF\\JsonLD\\EntityHydratorManager')->disableOriginalConstructor()->getMock();
     $entityHydratorManager->expects($this->once())->method('getHydratorForEntity')->with($entity)->will($this->returnValue(null));
     $extractor = new EntityExtractor($entityHydratorManager);
     $data1 = $extractor->extract($entity);
     $data2 = $extractor->extract($entity);
     $this->assertSame($data1, $data2);
 }
 /**
  * Create a entity and/or collection based on a metadata map
  *
  * @param  object $object
  * @param  Metadata $metadata
  * @param  bool $renderEmbeddedEntities
  * @return Entity|Collection
  * @throws Exception\RuntimeException
  */
 public function createEntityFromMetadata($object, Metadata $metadata, $renderEmbeddedEntities = true)
 {
     if ($metadata->isCollection()) {
         return $this->createCollectionFromMetadata($object, $metadata);
     }
     $data = $this->entityExtractor->extract($object);
     $entityIdentifierName = $metadata->getEntityIdentifierName();
     if ($entityIdentifierName && !isset($data[$entityIdentifierName])) {
         throw new Exception\RuntimeException(sprintf('Unable to determine entity identifier for object of type "%s"; no fields matching "%s"', get_class($object), $entityIdentifierName));
     }
     $id = $entityIdentifierName ? $data[$entityIdentifierName] : null;
     if (!$renderEmbeddedEntities) {
         $object = [];
     }
     $jsonLDEntity = new Entity($object, $id);
     $properties = $jsonLDEntity->getProperties();
     $this->marshalMetadataProperties($metadata, $properties);
     $forceFullUriID = $metadata->getForceFullUriID();
     if ($forceFullUriID && !$properties->has('id')) {
         $property = $this->marshalPropertyFromMetadata($metadata, $object, $id, $metadata->getRouteIdentifierName());
         $properties->add($property);
     }
     return $jsonLDEntity;
 }