You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

81 lines
1.9 KiB

  1. <?php
  2. /**
  3. * Event object
  4. *
  5. * See events list here: http://rockmongo.com/wiki/pluginDevelope?lang=en_us#%23%23%23+Events%0D
  6. *
  7. * @author Liu <q@yun4s.cn>
  8. */
  9. class REvent {
  10. private static $_events = array();
  11. private static $_listeners = array();
  12. /**
  13. * Dispatch event
  14. *
  15. * @param string $event Event name
  16. * @param array $params
  17. */
  18. public static function dispatch($event, array $params = array()) {
  19. if (empty(self::$_listeners[$event])) {
  20. return;
  21. }
  22. if (isset(self::$_events[$event]["enabled"]) && !self::$_events[$event]["enabled"]) {
  23. return;
  24. }
  25. foreach (rock_array_sort(self::$_listeners[$event], "priority") as $index => $listener) {
  26. call_user_func_array($listener["callback"], array($params));
  27. if (isset(self::$_events[$event]["enabled"]) && !self::$_events[$event]["enabled"]) {
  28. return;
  29. }
  30. }
  31. }
  32. /**
  33. * Add a event listener
  34. *
  35. * @param string $event Event name
  36. * @param callback|string $callback Event listener
  37. * @param integer $priority Listener priority
  38. */
  39. public static function listen($event, $callback, $priority = -1) {
  40. if ($priority == -1) {
  41. if (isset(self::$_listeners[$event])) {
  42. $priority = count(self::$_listeners[$event]);
  43. }
  44. }
  45. self::$_listeners[$event][] = array(
  46. "callback" => $callback,
  47. "priority" => $priority
  48. );
  49. }
  50. /**
  51. * Stop event propagation
  52. *
  53. * @param string $event Event name
  54. */
  55. public static function stop($event) {
  56. self::$_events[$event]["enabled"] = false;
  57. }
  58. /**
  59. * Remove a event listener
  60. *
  61. * @param string $event Event name
  62. * @param callback|string $callback Event listener
  63. */
  64. public static function remove($event, $callback) {
  65. if (empty(self::$_listeners[$event])) {
  66. return;
  67. }
  68. foreach (self::$_listeners[$event] as $index => $listener) {
  69. if ($listener["callback"] == $callback) {
  70. unset(self::$_listeners[$event][$index]);
  71. }
  72. }
  73. }
  74. }
  75. ?>