beforeHooks = $data['EventManager.beforeHooks'];
$this->afterHooks = $data['EventManager.afterHooks'];
}
/**
* Gets object data for caching
*
* @return Array
* @access public
*/
public function getToCache()
{
return Array (
'EventManager.beforeHooks' => $this->beforeHooks,
'EventManager.afterHooks' => $this->afterHooks
);
}
/**
* Returns hooks by mode
*
* @param int $mode
* @return Array
* @access protected
*/
protected function &getHooksByMode($mode)
{
if ($mode == hBEFORE) {
return $this->beforeHooks;
}
return $this->afterHooks;
}
/**
* Registers Hook from subprefix event to master prefix event
*
* @param string $hook_event
* @param string $do_event
* @param int $mode
* @param bool $conditional
* @access public
*/
public function registerHook($hook_event, $do_event, $mode = hAFTER, $conditional = false)
{
$hook_event = new kEvent($hook_event);
$do_event = new kEvent($do_event);
if ( ($hook_event->Prefix != '*') && !$this->Application->prefixRegistred($hook_event->Prefix) ) {
if ($this->Application->isDebugMode()) {
trigger_error('Prefix ' . $hook_event->Prefix . ' doesn\'t exist when trying to hook from ' . (string)$do_event . '', E_USER_WARNING);
}
return;
}
$hooks =& $this->getHooksByMode($mode);
$hook_key = str_replace(':', '.', (string)$hook_event);
$hooks[ strtolower($hook_key) ][] = Array (
'DoPrefix' => $do_event->Prefix,
'DoSpecial' => $do_event->Special,
'DoEvent' => $do_event->Name,
'Conditional' => $conditional,
);
}
/**
* Runs hooks for given event
*
* @param kEvent $event
* @param int $mode hBEFORE or hAFTER
* @access public
*/
public function runHooks(&$event, $mode)
{
// * - get hooks that are valid with any special of given prefix
$hooks = array_merge(
// given prefix, any special
$this->_getHooks($event, $mode, $event->Prefix.'.*'),
// given special, given special
$this->_getHooks($event, $mode),
// any prefix, any special
$this->_getHooks($event, $mode, '*.*'),
// any prefix, given special
$this->_getHooks($event, $mode, rtrim('*.' . $event->Special, '.'))
);
if (!$hooks) {
return ;
}
foreach ($hooks as $hook) {
if ($hook['DoSpecial'] == '*') {
// use same special as master event
$hook['DoSpecial'] = $event->Special;
}
$prefix_special = rtrim($hook['DoPrefix'].'_'.$hook['DoSpecial'], '_');
if ( $hook['Conditional'] && !$this->Application->GetVar($prefix_special) ) {
continue;
}
if ( $this->Application->prefixRegistred($hook['DoPrefix']) ) {
// run hook only, when it's config is found
$hook_event = new kEvent($hook['DoPrefix'] . '.' . $hook['DoSpecial'] . ':' . $hook['DoEvent']);
$hook_event->MasterEvent =& $event;
$this->Application->HandleEvent($hook_event);
}
}
}
/**
* Returns hooks for given event
*
* @param kEvent $event
* @param int $mode hBEFORE or hAFTER
* @param string $event_key
* @return Array
* @access protected
*/
protected function &_getHooks(&$event, $mode, $event_key = null)
{
$hooks =& $this->getHooksByMode($mode);
$event_key = isset($event_key) ? $event_key : $event->getPrefixSpecial();
if (!isset($hooks[strtolower($event_key.'.'.$event->Name)])) {
$ret = Array ();
return $ret;
}
return $hooks[ strtolower($event_key.'.'.$event->Name) ];
}
}