Listing 6

// Plugin.cxx

#include "Plugin.h"

PluginManager* PluginManager::ms_instance = 0;

PluginManager& PluginManager::instance()
{
    if (! ms_instance)
    ms_instance = new PluginManager();
    return *ms_instance;
}
Plugin& PluginManager::findPlugin(const char* name)
    throw (SharedLibraryException)
{
    if (m_plugin_map.count(name) > 0)
    return *(m_plugin_map[name])->m_plugin;

    const char* libname = PluginNameMap::instance().translate(name);
    if (libname == 0)
    throw SharedLibraryException("Cannot translate libname");

    PluginInfo* pi = new PluginInfo;
    pi->m_library = SharedLibrary::openSharedLibrary(libname);
    plugin_init_func pif =
        findSymbol<plugin_init_func>(*pi->m_library,"plugin_init");

    pi->m_plugin = (*pif)();
    if (!pi->m_plugin)
    {
    delete pi;
    throw SharedLibraryException("plugin_init error");
    }
    m_plugin_map[name]=pi;
    return *(pi->m_plugin);
}