private function doDetach($document, array &$visited)
{
$oid = spl_object_hash($document);
if (isset($visited[$oid])) {
return;
// Prevent infinite recursion
}
$visited[$oid] = $document;
// mark visited
switch ($this->getDocumentState($document, self::STATE_DETACHED)) {
case self::STATE_MANAGED:
$this->removeFromIdentityMap($document);
unset($this->documentInsertions[$oid], $this->documentUpdates[$oid], $this->documentDeletions[$oid], $this->documentIdentifiers[$oid], $this->documentStates[$oid], $this->originalDocumentData[$oid], $this->parentAssociations[$oid], $this->documentUpserts[$oid], $this->hasScheduledCollections[$oid], $this->embeddedDocumentsRegistry[$oid]);
break;
case self::STATE_NEW:
case self::STATE_DETACHED:
return;
}
$this->cascadeDetach($document, $visited);
}