class dtkCorePluginManagerBase : public QObject
{
%TypeHeaderCode
#include <dtkCore/dtkCorePluginManager.h>
%End

public:
    virtual ~dtkCorePluginManagerBase();

 public:
    virtual void   initialize(const QString& path) = 0;
    virtual void uninitialize() = 0;

    virtual void setVerboseLoading(bool value) = 0;
    virtual bool verboseLoading() const = 0;

    virtual void setAutoLoading(bool value) = 0;
    virtual bool autoLoading() const = 0;

    virtual void   load(const QString& path) = 0;
    virtual void unload(const QString& path) = 0;

    virtual void loadFromName(const QString& plugin_name) = 0;
};

template <TYPE> class dtkCorePluginManager : public dtkCorePluginManagerBase
{

%TypeHeaderCode
#include <dtkCore/dtkCorePluginManager.h>
%End

public:
     dtkCorePluginManager();
    ~dtkCorePluginManager();

    void   initialize(const QString& path);
    void uninitialize();

public:
    void setVerboseLoading(bool value);
    bool verboseLoading() const;
    void setAutoLoading(bool value);
    bool autoLoading() const;
    void loadFromName(const QString& plugin_name);
    void setLayerVersion(const QString& layer_version);

    void   load(const QString& path);
    void unload(const QString& path);

    QStringList plugins() const ;
    QStringList availablePlugins() const;

};
