From b75e43962a5a7a222dc2ea62e41326038d861dbd Mon Sep 17 00:00:00 2001 From: Kevin Dangoor Date: Tue, 14 Dec 2010 11:16:53 -0800 Subject: [PATCH] add register hook to register global things (settings, commands, types) from plugins. startup hook is used for starting an individual instance. --- demo/boot.js | 9 +++++---- plugins/pilot/lib/plugin_manager.js | 29 +++++++++++++++++++++++++---- 2 files changed, 30 insertions(+), 8 deletions(-) diff --git a/demo/boot.js b/demo/boot.js index 8cb3e6e3..eec770a1 100644 --- a/demo/boot.js +++ b/demo/boot.js @@ -121,9 +121,10 @@ console.log(JSON.stringify({ var pluginsModule = require("pilot/plugin_manager"); var settings = require("pilot/settings").settings; var catalog = pluginsModule.catalog; - catalog.registerPlugins(knownPlugins); - if (callback) { - callback(pluginsModule, settings); - } + catalog.registerPlugins(knownPlugins).then(function() { + if (callback) { + callback(pluginsModule, settings); + } + }); }); }; diff --git a/plugins/pilot/lib/plugin_manager.js b/plugins/pilot/lib/plugin_manager.js index 79b5b4cc..d004240d 100644 --- a/plugins/pilot/lib/plugin_manager.js +++ b/plugins/pilot/lib/plugin_manager.js @@ -61,8 +61,10 @@ exports.Plugin.prototype = { */ NEW: 0, INSTALLED: 1, - STARTED: 2, - SHUTDOWN: 3, + REGISTERED: 2, + STARTED: 3, + UNREGISTERED: 4, + SHUTDOWN: 5, install: function(data, reason) { var pr = new Promise(); @@ -79,10 +81,26 @@ exports.Plugin.prototype = { }.bind(this)); return pr; }, + + register: function(data, reason) { + var pr = new Promise(); + if (this.status != this.INSTALLED) { + pr.resolve(this); + return pr; + } + require([this.name], function(pluginModule) { + if (pluginModule.register) { + pluginModule.register(data, reason); + } + this.status = this.REGISTERED; + pr.resolve(this); + }.bind(this)); + return pr; + }, startup: function(data, reason) { var pr = new Promise(); - if (this.status != this.INSTALLED) { + if (this.status != this.REGISTERED) { pr.resolve(this); return pr; } @@ -112,14 +130,17 @@ exports.PluginCatalog = function() { }; exports.PluginCatalog.prototype = { - registerPlugins: function(pluginList) { + registerPlugins: function(pluginList, data, reason) { + var registrationPromises = []; pluginList.forEach(function(pluginName) { var plugin = this.plugins[pluginName]; if (plugin === undefined) { plugin = new exports.Plugin(pluginName); this.plugins[pluginName] = plugin; + registrationPromises.push(plugin.register(data, reason)); } }.bind(this)); + return Promise.group(registrationPromises); }, startupPlugins: function(data, reason) {