1 /**
2 Copyright: Copyright (c) 2015-2016 Andrey Penechko.
3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0).
4 Authors: Andrey Penechko.
5 */
6
7 module pluginlib.pluginmanager;
8
9 import std.experimental.logger;
10 import std.string : format;
11 import pluginlib;
12
13 class PluginManager : IPluginManager, IResourceManagerRegistry
14 {
15 IPlugin[TypeInfo] plugins;
16 IPlugin[string] pluginsById;
17 IResourceManager[TypeInfo] resourceManagers;
18
19 void registerPlugin(IPlugin pluginInstance)
20 {
21 assert(pluginInstance);
22 assert(
23 typeid(pluginInstance) !in plugins &&
24 pluginInstance.id !in pluginsById,
25 format("Duplicate plugin registered: id=\"%s\" type=\"%s\"",
26 pluginInstance.id, pluginInstance));
27 plugins[typeid(pluginInstance)] = pluginInstance;
28 pluginsById[pluginInstance.id] = pluginInstance;
29 }
30
31 void registerResourceManager(IResourceManager rmInstance)
32 {
33 assert(rmInstance);
34 assert(typeid(rmInstance) !in resourceManagers,
35 format("Duplicate resource manager registered: id=\"%s\" type=\"%s\"",
36 rmInstance.id, rmInstance));
37 resourceManagers[typeid(rmInstance)] = rmInstance;
38 }
39
40 // IPluginManager
41 IPlugin findPlugin(TypeInfo pluginType)
42 {
43 return plugins.get(pluginType, null);
44 }
45
46 IPlugin findPluginById(string pluginId)
47 {
48 return pluginsById.get(pluginId, null);
49 }
50
51
52 // IResourceManagerRegistry
53 IResourceManager findResourceManager(TypeInfo rmType)
54 {
55 return resourceManagers.get(rmType, null);
56 }
57
58 void initPlugins()
59 {
60 // Register resources
61 foreach(IPlugin p; plugins)
62 {
63 p.registerResourceManagers(®isterResourceManager);
64 }
65
66 foreach(IResourceManager rm; resourceManagers)
67 {
68 rm.preInit();
69 }
70 foreach(IResourceManager rm; resourceManagers)
71 {
72 rm.init(this);
73 }
74
75 foreach(IPlugin p; plugins)
76 {
77 p.registerResources(this);
78 }
79
80 // Load resources
81 foreach(IResourceManager rm; resourceManagers)
82 {
83 rm.loadResources();
84 }
85 foreach(IResourceManager rm; resourceManagers)
86 {
87 rm.postInit();
88 }
89
90 // Load plugins
91 foreach(IPlugin p; plugins)
92 {
93 p.preInit();
94 }
95 foreach(IPlugin p; plugins)
96 {
97 p.init(this);
98 }
99
100 foreach(IPlugin p; plugins)
101 {
102 p.postInit();
103 }
104
105 size_t i = 1;
106 infof("Loaded %s plugins", plugins.length);
107 foreach(IPlugin p; plugins)
108 {
109 infof("Loaded #%s %s %s", i, p.id, p.semver);
110 ++i;
111 }
112 }
113 }