[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