/* EVENT.T * Event handling module for TADS * * This module creates the class Event. Other objects can register interest * in an Event (or indicate that they are no longer interested). When the * Event is raised, an appropriate method will be called for each registered * object. By default, the receiveEvent method is called, but an Event may * specify a different callback method. * * While it would be fairly trivial to enable the user to pass arguments to * an Event when raised, I've decided to skip that for now. * * Copyright Shadow Wolf, 2003. All Rights Reserved. * * You may modify and use this file in any way you want, provided that * if you redistribute modified copies of this file in source form, the * copies must include the original copyright notice (including this * paragraph), and must be clearly marked as modified from the original * version. * */ /********************************************* * Using EVENT.T * * The Event class is very easy to use. For each type of event you wish to * handle, simply define a new Event object: * * magicIsUsedEvent: Event * callback = &magicIsUsed * ; * * In any objects that need to know about this event, define the callback * function you chose, and have the object register to be notified of the * event: * * evilVillian: Actor, initialization * magicSensed = 0 * magicIsUsed(e) = { * // The argument can be used if multiple events have the same * // callback, such as with the receiveEvent default * self.magicSensed++; * if (self.magicSensed > threshold) killPlayer(); * } * preinit_phase = { * // this method defined by Jeff Liang's sysfuncs.t module * magicIsUsedEvent.register(self); * } * ; * * When the event occurs, call the event's raise method. * * castSpell: function(actor) * { * // do the actual magic, then * magicIsUsedEvent.raise; * } * */ #pragma C+ class Event: object observers = [] callback = &receiveEvent register(obj) = { observers += obj; } unregister(obj) = { observers -= obj; } raise = { local c, l = self.observers; while (l != []) { c = car(l); l = cdr(l); if (defined (c, self.callback)) // Safety first! c.(self.callback) (self); } } ;