[geeklog-devel] GL2 event model
Vincent Furia
vfuria at gmail.com
Wed Jul 21 21:23:51 EDT 2004
Here is what I had envisioned when I penned the Plugin API
documentation. It is a class that would be instantiated only once by
GL2 core and available globally. I prefer the per event registration
as it will reduce the calls the "PluginEventHanlder" will have to make
to listening plugins.
-Vinny
class PluginEventHandler {
/**
* Array containing event keys and listener (arrays as) values
* @access private
* @var array
*/
private $listeners = array();
/**
* PluginEventHandler Constructor
*
* @access public
*
*/
function __construct() {
// fetch registered listeners from database, populate $listeners
}
/**
* Register a plugin to listen for an event
*
* @access public
* @param mixed $event event(s) to listen for (string or array)
* @param string $plugin plugin to be registered as listener
* @return boolean true on success
*
*/
function registerListener($event, $plugin) {
// add the listener to the $listeners variable and the database
}
/**
* Unregister a plugin from listening for an event
*
* @access public
* @param mixed $event event(s) to unregister (string or array)
* @param string $plugin plugin to be unregistered as listener
* @return boolean true on success
*
*/
function unregisterListener($event, $plugin) {
// remove the listener for the specified events from $listeners
// and the database.
}
/**
* Get all the listeners for a specific event
*
* @access public
* @param string $event event to get listeners of
* @return array array of listeners to event $event
*
*/
function getListeners($event) {
// remove the listener for the specified events from $listeners
// and the database.
}
/**
* Notify all listeners that an event has occurred
*
* @access public
* @param mixed $event event requiring notification
* @param mixed $vars event specific variables
* @param mixed $plugin NOTIFY_ALL, specific plugin, or array of plugins
* @return mixed event specific return values (or array of)
*
*/
function notify($event, $vars, $plugin = NOTIFY_ALL) {
}
}
On Wed, 21 Jul 2004 22:10:55 +0000, Tom Willett <tomw at pigstye.net> wrote:
> Let me get this straight.
>
> GL2 Core would make the MySubjectObserverClass
>
> $obs = new MySubjectObserverClass;
>
> then the plugin would register by somehow getting the reference to the
> MySubjectOvserverClass and register itself as a listener
>
> $obs->addListner($MyPlugin);
> or
> $obs->addListener($MyPlugin, $events);
> etc
>
> Then when a event happened GL2 Core or a plugin could notify the plugins
>
> $obs->notifyAll($event)
>
> Do I have this about right?
>
> --
> Tom Willett
> tomw at pigstye.net
>
>
>
> ---------- Original Message -----------
> From: Tony Bibbs <tony at tonybibbs.com>
> To: geeklog-devel at lists.geeklog.net
> Sent: Wed, 21 Jul 2004 16:31:57 -0500
> Subject: [geeklog-devel] GL2 event model
>
> > The plugin API for GL2 that Vinny has drafted if surprisingly small
> > because we are introducing an event based model. Essentially, the GL2
> > and all plugins have the option to register events that others can
> > listen to. To implement this I recommend an observer/observable design
> > pattern similar to the example below. A few things that need
> > discussion. First, the example below allows listening only at the
> > object level. The alternative is the force listening at the event level
> > (in otherwords, addListener would take as a second arg an array of
> > events the object listens to). Any preference? General questions?:
> >
> > class MySubjectObserverClass {
> > private $listeners = array();
> > private $listernerNextID = 0;
> >
> > // Alternative names: register, subscribe...
> > public function addListerner(&$obj)
> > {
> > $this->_listerners[] =& $obj;
> > return $this->listernerNextID++;
> > }
> >
> > // Alternative name: unregister, unsubscribe...
> > public function removeListerner($id,'even't)
> > {
> > unset($this->listerners[$id]);
> > }
> >
> > // Alternative name: broadcast...
> > public function notifyAll($event)
> > {
> > foreach ($this->listerners as $id => $obj)
> > {
> > $this->listerners[$id]->notify($event, $this);
> > }
> > }
> >
> > // Alternative name: listen...
> > function notify($event, &$obj)
> > {
> > switch (get_class($obj)) {
> > case 'blah':
> > ...
> > }
> > }
> > }
> >
> > _______________________________________________
> > geeklog-devel mailing list
> > geeklog-devel at lists.geeklog.net
> > http://lists.geeklog.net/listinfo/geeklog-devel
> ------- End of Original Message -------
>
>
>
> _______________________________________________
> geeklog-devel mailing list
> geeklog-devel at lists.geeklog.net
> http://lists.geeklog.net/listinfo/geeklog-devel
>
More information about the geeklog-devel
mailing list