RED.hooks = (function() { var VALID_HOOKS = [ ] var hooks = { } var labelledHooks = { } function add(hookId, callback) { var parts = hookId.split("."); var id = parts[0], label = parts[1]; // if (VALID_HOOKS.indexOf(id) === -1) { // throw new Error("Invalid hook '"+id+"'"); // } if (label && labelledHooks[label] && labelledHooks[label][id]) { throw new Error("Hook "+hookId+" already registered") } var hookItem = {cb:callback, previousHook: null, nextHook: null } var tailItem = hooks[id]; if (tailItem === undefined) { hooks[id] = hookItem; } else { while(tailItem.nextHook !== null) { tailItem = tailItem.nextHook } tailItem.nextHook = hookItem; hookItem.previousHook = tailItem; } if (label) { labelledHooks[label] = labelledHooks[label]||{}; labelledHooks[label][id] = hookItem; } } function remove(hookId) { var parts = hookId.split("."); var id = parts[0], label = parts[1]; if ( !label) { throw new Error("Cannot remove hook without label: "+hookId) } if (labelledHooks[label]) { if (id === "*") { // Remove all hooks for this label var hookList = Object.keys(labelledHooks[label]); for (var i=0;i