#ifndef MODULE_H
#define MODULE_H

#include "pch.hpp"

class App;

class Module {

    friend class App;

    public:
        typedef Module* create_t(void*, App&);
        typedef void* destroy_t(Module*);

        Module(void* h, App& a) : handle(h), app(a) {};
        virtual ~Module() {}
        virtual void run() = 0;
        std::string getName() const { return name; }
        void* getHandle() { return handle; }

        void setSelf(std::list<Module*>::iterator s) { self = s; }
    
    protected:
        std::string name;
        void* handle;
        std::list<Module*>::iterator self;

        App& app;

};

#endif
