public function addObserver($callback, $nName = EVENT_DISPATCHER_GLOBAL, $class = null)
{
if (is_array($callback)) {
if (is_object($callback[0])) {
// Note : PHP4 does not allow correct object comparison so
// only the class name is used for registration checks.
$reg = get_class($callback[0]) . '::' . $callback[1];
} else {
$reg = $callback[0] . '::' . $callback[1];
}
} else {
$reg = $callback;
}
$this->_ro[$nName][$reg] = array('callback' => $callback, 'class' => $class);
// Post eventual pending notifications for this observer
if (isset($this->_pending[$nName])) {
foreach (array_keys($this->_pending[$nName]) as $k) {
$notification =& $this->_pending[$nName][$k];
if (!$notification->isNotificationCancelled()) {
$objClass = get_class($notification->getNotificationObject());
if (empty($class) || strcasecmp($class, $objClass) == 0) {
call_user_func_array($callback, array(&$notification));
$notification->increaseNotificationCount();
}
}
}
}
}