/**
  * @param RdfWriter $writer
  * @param int $flavor Bitmap for the output flavor, use RdfProducer::PRODUCE_XXX constants.
  * @param EntityId[] &$mentioned Receives any entity IDs being mentioned.
  * @param DedupeBag|null $dedupe A bag of reference hashes that should be considered "already seen".
  *
  * @return FullStatementRdfBuilder
  */
 private function newBuilder(RdfWriter $writer, $flavor, array &$mentioned = array(), DedupeBag $dedupe = null)
 {
     $vocabulary = $this->getTestData()->getVocabulary();
     $mentionTracker = $this->getMock('Wikibase\\Rdf\\EntityMentionListener');
     $mentionTracker->expects($this->any())->method('propertyMentioned')->will($this->returnCallback(function (EntityId $id) use(&$mentioned) {
         $key = $id->getSerialization();
         $mentioned[$key] = $id;
     }));
     // Note: using the actual factory here makes this an integration test!
     $valueBuilderFactory = WikibaseRepo::getDefaultInstance()->getValueSnakRdfBuilderFactory();
     if ($flavor & RdfProducer::PRODUCE_FULL_VALUES) {
         $valueWriter = $writer->sub();
         $statementValueBuilder = $valueBuilderFactory->getComplexValueSnakRdfBuilder($this->getTestData()->getVocabulary(), $valueWriter, $mentionTracker, new HashDedupeBag());
     } else {
         $statementValueBuilder = $valueBuilderFactory->getSimpleValueSnakRdfBuilder($this->getTestData()->getVocabulary(), $writer, $mentionTracker, new HashDedupeBag());
     }
     $snakRdfBuilder = new SnakRdfBuilder($vocabulary, $statementValueBuilder, $this->getTestData()->getMockRepository());
     $statementBuilder = new FullStatementRdfBuilder($vocabulary, $writer, $snakRdfBuilder);
     $statementBuilder->setDedupeBag($dedupe ?: new NullDedupeBag());
     if ($flavor & RdfProducer::PRODUCE_PROPERTIES) {
         $snakRdfBuilder->setEntityMentionListener($mentionTracker);
     }
     $statementBuilder->setProduceQualifiers($flavor & RdfProducer::PRODUCE_QUALIFIERS);
     $statementBuilder->setProduceReferences($flavor & RdfProducer::PRODUCE_REFERENCES);
     return $statementBuilder;
 }
 /**
  * @param RdfVocabulary $vocabulary
  * @param RdfWriter $writer
  * @param SnakRdfBuilder $snakBuilder
  */
 public function __construct(RdfVocabulary $vocabulary, RdfWriter $writer, SnakRdfBuilder $snakBuilder)
 {
     $this->vocabulary = $vocabulary;
     // Note: since we process references as nested structures, they need a separate
     // rdf writer, so outputting references doesn't destroy the state of the statement writer.
     $this->statementWriter = $writer;
     $this->referenceWriter = $writer->sub();
     $this->snakBuilder = $snakBuilder;
     $this->dedupeBag = new NullDedupeBag();
 }