summaryrefslogtreecommitdiff
path: root/kohana/libraries/Event_Subject.php
diff options
context:
space:
mode:
Diffstat (limited to 'kohana/libraries/Event_Subject.php')
-rw-r--r--kohana/libraries/Event_Subject.php67
1 files changed, 67 insertions, 0 deletions
diff --git a/kohana/libraries/Event_Subject.php b/kohana/libraries/Event_Subject.php
new file mode 100644
index 00000000..35b0990d
--- /dev/null
+++ b/kohana/libraries/Event_Subject.php
@@ -0,0 +1,67 @@
+<?php defined('SYSPATH') or die('No direct script access.');
+/**
+ * Kohana event subject. Uses the SPL observer pattern.
+ *
+ * $Id$
+ *
+ * @package Core
+ * @author Kohana Team
+ * @copyright (c) 2007-2008 Kohana Team
+ * @license http://kohanaphp.com/license.html
+ */
+abstract class Event_Subject implements SplSubject {
+
+ // Attached subject listeners
+ protected $listeners = array();
+
+ /**
+ * Attach an observer to the object.
+ *
+ * @chainable
+ * @param object Event_Observer
+ * @return object
+ */
+ public function attach(SplObserver $obj)
+ {
+ if ( ! ($obj instanceof Event_Observer))
+ throw new Kohana_Exception('eventable.invalid_observer', get_class($obj), get_class($this));
+
+ // Add a new listener
+ $this->listeners[spl_object_hash($obj)] = $obj;
+
+ return $this;
+ }
+
+ /**
+ * Detach an observer from the object.
+ *
+ * @chainable
+ * @param object Event_Observer
+ * @return object
+ */
+ public function detach(SplObserver $obj)
+ {
+ // Remove the listener
+ unset($this->listeners[spl_object_hash($obj)]);
+
+ return $this;
+ }
+
+ /**
+ * Notify all attached observers of a new message.
+ *
+ * @chainable
+ * @param mixed message string, object, or array
+ * @return object
+ */
+ public function notify($message)
+ {
+ foreach ($this->listeners as $obj)
+ {
+ $obj->notify($message);
+ }
+
+ return $this;
+ }
+
+} // End Event Subject \ No newline at end of file