[geeklog-devel] GL2 event model
Vincent Furia
vfuria at gmail.com
Sat Jul 31 23:11:51 EDT 2004
No problem with the addition that Tony made. I also agree that we
should add a 'precedence' (what Tony call priority) field. I think
this is as easy as changing one function in the class:
public function registerListener($events, $plugin)
--to--
public function registerListener($events, $plugin, $precedence = 100)
And when the $listeners field is loaded, the array of events should be
populate in order lower precedence to higher precedence.
Where $precedence is an integer that we recommend goes from 0 - 255.
The Geeklog core then could potentially use precedence values > 255 or
< 0 if it needs to operate before or after all the other plugins.
Really, I don't think it matters what numbers we use, so any
suggestions that are more logical from a plugin developers standpoint
would be great.
-Vinny
On Fri, 30 Jul 2004 15:50:35 -0500, Tony Bibbs <tony at tonybibbs.com> wrote:
> 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
> >
> >
>
>
>
More information about the geeklog-devel
mailing list