IComponentManager.h
1 
27 #ifndef COSMO_COMPONENT_MANAGER_INTERFACE_H
28 #define COSMO_COMPONENT_MANAGER_INTERFACE_H
29 
30 #include <Pt/Cosmo/Api.h>
31 #include <Pt/Cosmo/IUnknown.h>
32 #include <Pt/Cosmo/ComponentInfo.h>
33 #include <Pt/Cosmo/IEnumerable.h>
34 
35 #include <string>
36 #include <vector>
37 #include <stdexcept>
38 
39 namespace Pt {
40 
41 namespace Cosmo {
42 
43 class IComponentPlugin;
44 
55 {
56  public:
60  {}
61 
65  const std::string& require,
66  const std::string& instance);
67 
70  void load();
71 
74  void load(const std::string& instance);
75 
78  void unload(IComponentPlugin& plugin);
79 
82  void unload(const std::string& instanceId);
83 
87  {
88  return onGetComponents();
89  }
90 
91  protected:
94  virtual void onRegisterComponent(IComponentPlugin& plugin,
95  const std::string& require,
96  const std::string& instance) = 0;
97 
98 
101  virtual void onLoad() = 0;
102 
105  virtual void onLoadInstance(const std::string& instanceId) = 0;
106 
109  virtual void onUnload(IComponentPlugin& plugin) = 0;
110 
113  virtual IComponentPlugin* onUnloadInstance(const std::string& instanceId) = 0;
114 
117  virtual const IEnumerable<ComponentInfo>& onGetComponents() const = 0;
118 };
119 
120 } // namespace Cosmo
121 
122 } // namespace Pt
123 
124 #include <Pt/Cosmo/IComponentPlugin.h>
125 
126 namespace Pt {
127 
128 namespace Cosmo {
129 
131  const std::string& require,
132  const std::string& instance)
133 {
134  plugin.onAttach(*this, instance);
135  onRegisterComponent(plugin, require, instance);
136 }
137 
138 
140 {
141  onLoad();
142 }
143 
144 
145 inline void IComponentManager::load(const std::string& instance)
146 {
147  onLoadInstance(instance);
148 }
149 
150 
152 {
153  onUnload(plugin);
154  plugin.onDetach(*this);
155 }
156 
157 
158 inline void IComponentManager::unload(const std::string& instanceId)
159 {
160  IComponentPlugin* plugin = onUnloadInstance(instanceId);
161  if(plugin)
162  plugin->onDetach(*this, instanceId);
163 }
164 
165 } // namespace Cosmo
166 
167 } // namespace Pt
168 
169 #endif
Core module.
Definition: Allocator.h:33
Enumerable interface.
Definition: IEnumerable.h:58
virtual void onLoadInstance(const std::string &instanceId)=0
Loads a component instance.
virtual void onAttach(IComponentManager &cm, const std::string &instance)=0
The plugin is attached to a component manager.
virtual void onDetach(IComponentManager &cm, const std::string &instance)=0
The plugin is detached from a component manager.
void unload(IComponentPlugin &plugin)
Unloads a component plugin.
Definition: IComponentManager.h:151
Component plugin interface.
Definition: IComponentPlugin.h:51
Interface base class.
Definition: IUnknown.h:44
Component manager interface.
Definition: IComponentManager.h:55
virtual void onLoad()=0
Loads all registered components.
virtual void onUnload(IComponentPlugin &plugin)=0
Unloads a plugin and all components using it.
void load()
Loads all registered components.
Definition: IComponentManager.h:139
virtual void onRegisterComponent(IComponentPlugin &plugin, const std::string &require, const std::string &instance)=0
Registers component.
virtual IComponentPlugin * onUnloadInstance(const std::string &instanceId)=0
Unloads a component instance.
void registerComponent(IComponentPlugin &plugin, const std::string &require, const std::string &instance)
Registers component.
Definition: IComponentManager.h:130
virtual const IEnumerable< ComponentInfo > & onGetComponents() const =0
Returns component infos.
virtual ~IComponentManager()
Destructor.
Definition: IComponentManager.h:59
const IEnumerable< ComponentInfo > & components() const
Returns component infos.
Definition: IComponentManager.h:86