path = trim(Get::_get('p', null), '/'); $this->__mods = array(); $this->__hooks = array(); array_unshift($modules, 'core'); foreach ($modules as $module) { $this->__mods[$module] = $m = PLModule::factory($this, $module); $this->__hooks += $m->handlers(); } } function find_hook() { $p = $this->path; while ($p) { if (array_key_exists($p, $this->__hooks)) break; $p = substr($p, 0, strrpos($p, '/')); } if (empty($this->__hooks[$p])) { return null; } $hook = $this->__hooks[$p]; if (!is_callable($hook['hook'])) { return null; } $this->argv = explode('/', substr($this->path, strlen($p))); $this->argv[0] = $p; return $hook; } function call_hook(&$page) { $hook = $this->find_hook(); if (is_null($hook)) { return PL_NOT_FOUND; } $args = $this->argv; $args[0] = &$page; if ($hook['auth'] > S::v('auth', AUTH_PUBLIC)) { // FIXME: don't use 'session' object anymore $_SESSION['session']->doAuth($page); } return call_user_func_array($hook['hook'], $args); } function run() { global $page; new_skinned_page('index.tpl', AUTH_PUBLIC); if (empty($this->path)) { $this->path = 'index'; } switch ($this->call_hook($page)) { case PL_FORBIDDEN: $this->__mods['core']->handler_403($page); break; case PL_NOT_FOUND: $this->__mods['core']->handler_404($page); break; } $page->assign_by_ref('platal', $this); $page->run(); } } ?>