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)) {
case self::STATE_MANAGED:
if (isset($this->identityMap[$this->documentIdentifiers[$oid]])) {
$this->removeFromIdentityMap($document);
}
unset($this->scheduledRemovals[$oid], $this->scheduledUpdates[$oid], $this->originalData[$oid], $this->documentRevisions[$oid], $this->documentIdentifiers[$oid], $this->documentState[$oid]);
break;
case self::STATE_NEW:
case self::STATE_DETACHED:
return;
}
$this->cascadeDetach($document, $visited);
}