private function doRemove($xmlEntity, array &$visited)
{
$oid = spl_object_hash($xmlEntity);
if (isset($visited[$oid])) {
return;
// Prevent infinite recursion
}
$visited[$oid] = $xmlEntity;
// mark visited
$class = $this->xem->getClassMetadata(get_class($xmlEntity));
$entityState = $this->getXmlEntityState($xmlEntity);
switch ($entityState) {
case self::STATE_NEW:
case self::STATE_REMOVED:
// nothing to do
break;
case self::STATE_MANAGED:
if (isset($class->lifecycleCallbacks[Events::preRemove])) {
$class->invokeLifecycleCallbacks(Events::preRemove, $xmlEntity);
}
if ($this->evm->hasListeners(Events::preRemove)) {
$this->evm->dispatchEvent(Events::preRemove, new Event\LifecycleEventArgs($xmlEntity, $this->xem));
}
$this->scheduleForDelete($xmlEntity);
break;
case self::STATE_DETACHED:
throw new InvalidArgumentException("A detached xml entity can not be removed.");
default:
throw new UnexpectedValueException("Unexpected xml entity state: {$entityState}.");
}
}