diff options
Diffstat (limited to 'system/libraries/Event_Subject.php')
-rw-r--r-- | system/libraries/Event_Subject.php | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/system/libraries/Event_Subject.php b/system/libraries/Event_Subject.php new file mode 100644 index 00000000..d1ccc544 --- /dev/null +++ b/system/libraries/Event_Subject.php @@ -0,0 +1,67 @@ +<?php defined('SYSPATH') OR die('No direct access allowed.'); +/** + * Kohana event subject. Uses the SPL observer pattern. + * + * $Id: Event_Subject.php 3769 2008-12-15 00:48:56Z zombor $ + * + * @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 |