[geeklog-devel] GL2 event model

Tony Bibbs tony at tonybibbs.com
Fri Jul 30 16:50:35 EDT 2004


To fill in the blanks more I offer up the attached version. Only
difference is I show how the plugins are actually called. Also, we
might want to consider a 'priority' field for events that plugins listen
to. Using priorities would allow plugins to get called in some sort of
priorty fashion. I say that we come up with a standard set of
priorities that plugins can use. This make sense?

--Tony

Vincent Furia wrote:


>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

>>

>>

>>

>_______________________________________________

>geeklog-devel mailing list

>geeklog-devel at lists.geeklog.net

>http://lists.geeklog.net/listinfo/geeklog-devel

>

>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: aptenoPluginFactory.class.php
Type: application/x-php
Size: 3463 bytes
Desc: not available
Url : <http://eight.pairlist.net/pipermail/geeklog-devel/attachments/20040730/95ca7e64/attachment.bin>


More information about the geeklog-devel mailing list