+class StatusNet_URL_Mapper extends Net_URL_Mapper
+{
+ private static $_singleton = null;
+ private $_actionToPath = array();
+
+ private function __construct()
+ {
+ }
+
+ public static function getInstance($id = '__default__')
+ {
+ if (empty(self::$_singleton)) {
+ self::$_singleton = new StatusNet_URL_Mapper();
+ }
+ return self::$_singleton;
+ }
+
+ public function connect($path, $defaults = array(), $rules = array())
+ {
+ $result = null;
+ if (Event::handle('StartConnectPath', array(&$path, &$defaults, &$rules, &$result))) {
+ $result = parent::connect($path, $defaults, $rules);
+ if (array_key_exists('action', $defaults)) {
+ $action = $defaults['action'];
+ } elseif (array_key_exists('action', $rules)) {
+ $action = $rules['action'];
+ } else {
+ $action = null;
+ }
+ $this->_mapAction($action, $result);
+ Event::handle('EndConnectPath', array($path, $defaults, $rules, $result));
+ }
+ return $result;
+ }
+
+ protected function _mapAction($action, $path)
+ {
+ if (!array_key_exists($action, $this->_actionToPath)) {
+ $this->_actionToPath[$action] = array();
+ }
+ $this->_actionToPath[$action][] = $path;
+ return;
+ }
+
+ public function generate($values = array(), $qstring = array(), $anchor = '')
+ {
+ if (!array_key_exists('action', $values)) {
+ return parent::generate($values, $qstring, $anchor);
+ }
+
+ $action = $values['action'];
+
+ if (!array_key_exists($action, $this->_actionToPath)) {
+ return parent::generate($values, $qstring, $anchor);
+ }
+
+ $oldPaths = $this->paths;
+ $this->paths = $this->_actionToPath[$action];
+ $result = parent::generate($values, $qstring, $anchor);
+ $this->paths = $oldPaths;
+
+ return $result;
+ }
+}
+