private function doRemove($document, &$visited)
{
$oid = spl_object_hash($document);
if (isset($visited[$oid])) {
return;
}
$visited[$oid] = true;
$state = $this->getDocumentState($document);
switch ($state) {
case self::STATE_NEW:
unset($this->scheduledInserts[$oid]);
break;
case self::STATE_MANAGED:
unset($this->scheduledMoves[$oid]);
unset($this->scheduledReorders[$oid]);
break;
case self::STATE_DETACHED:
throw new InvalidArgumentException('Detached document passed to remove(): ' . self::objToStr($document, $this->dm));
}
$this->scheduledRemovals[$oid] = $document;
$this->setDocumentState($oid, self::STATE_REMOVED);
$class = $this->dm->getClassMetadata(get_class($document));
if ($invoke = $this->eventListenersInvoker->getSubscribedSystems($class, Event::preRemove)) {
$this->eventListenersInvoker->invoke($class, Event::preRemove, $document, new LifecycleEventArgs($document, $this->dm), $invoke);
}
$this->cascadeRemove($class, $document, $visited);
}