#pragma once
#include <drogon/plugins/Plugin.h>
#include <map>
namespace drogon
{
using PluginBasePtr = std::shared_ptr<PluginBase>;
class PluginsManager : trantor::NonCopyable
{
  public:
    void initializeAllPlugins(
        const Json::Value &configs,
        const std::function<void(PluginBase *)> &forEachCallback);
    PluginBase *getPlugin(const std::string &pluginName);
    std::shared_ptr<PluginBase> getSharedPlugin(const std::string &pluginName);
    ~PluginsManager();
  private:
    void createPlugin(const std::string &pluginName);
    std::map<std::string, PluginBasePtr> pluginsMap_;
    std::vector<PluginBase *> initializedPlugins_;
};
}  