/** * The main base class. Manages the signal system. * * @param signals Map with all connected signal handlers **/ Vn.Object = new Class ({ Tag: 'vn-object' ,Properties: {} ,signals: {} ,initialize: function (props) { for (var prop in props) this[prop] = props[prop]; } ,loadXml: function (builder, node) { return null; } /** * Conects a signal with a function. * * @param {String} id The signal identifier * @param {Function} callback The callback * @param {Object} instance The instance **/ ,on: function (id, callback, instance) { if (!(callback instanceof Function)) { console.warn ('Vn.Object: Invalid callback for signal \'%s\'', id); return; } if (!this.signals[id]) this.signals[id] = []; this.signals[id].push ({ blocked: false ,callback: callback ,instance: instance }); } /** * Locks/Unlocks a signal emission to the specified object. * * @param {String} id The signal identifier * @param {Function} callback The callback * @param {Boolean} block %true for lock the signal, %false for unlock **/ ,blockSignal: function (id, callback, block) { var callbacks = this.signals[id]; if (!callbacks) return; for (var i = 0; i < callbacks.length; i++) if (callbacks[i].callback == callback) callbacks[i].blocked = block; } /** * Emits a signal in the current object. * * @param {String} id The signal identifier **/ ,signalEmit: function (id) { var callbacks = this.signals[id]; if (!callbacks) return; var callbackArgs = []; callbackArgs.push (this); for (var i = 1; i < arguments.length; i++) callbackArgs.push (arguments[i]); for (var i = 0; i < callbacks.length; i++) if (!callbacks[i].blocked) callbacks[i].callback.apply (callbacks[i].instance, callbackArgs); } /** * Disconnects a signal from current object. * * @param {String} id The signal identifier * @param {Function} callback The connected callback * @param {Object} instance The instance **/ ,disconnect: function (id, callback, instance) { var callbacks = this.signals[id]; if (!callbacks) return; for (var i = 0; i < callbacks.length; i++) if (callbacks[i].callback == callback && callbacks[i].instance == instance) callbacks.splice (i--, 1); } /** * Destroys the object, this method should only be called before losing * the last reference to the object. **/ ,destroy: function () { delete this.signals; } ,link: function (prop, handlers) { for (var key in prop) { var newObject = prop[key]; var oldObject = this[key]; if (oldObject) for (var signal in handlers) oldObject.disconnect (signal, handlers[signal], this); this[key] = newObject; if (newObject) for (var signal in handlers) newObject.on (signal, handlers[signal], this); } } });