[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: <https://pairlist8.pair.net/pipermail/geeklog-devel/attachments/20040730/95ca7e64/attachment.bin>
More information about the geeklog-devel
mailing list