#ifndef EMODULE_H
#define EMODULE_H

#include "evar.h"
#include "estr.h"
#include "eparser.h"
#include "logger.h"
#include "evarclass_dec.h"
#include "evarclassconverter.h"

struct emoduleInfo {
  eparser *parser;
  elogger *logger;
  emodule *module;
  estrhashof<eclassBase> *classes;
  estrhashof<eclassBase*> *classNames;
  estrhashof< estrhashof< eclassConverterBase > > *classConverters;
};

class emodule
{
 public:
#ifdef _WIN32
  HMODULE hModule;
#else
  void *hModule;
#endif
  estr name;

  estrarrayof<efunc> funcs;

  emodule();
  emodule(const estr& name);
  bool load();
  bool unload();
  bool reload();

  void registerFunc(const efunc& f,const estr& fname);
};

class emodules
{
 public:
  estrhashof<emodule> modules;
  bool load(const estr& module);
  bool unload(const estr& module);
  bool reload(const estr& module);
};

void emoduleInit(emoduleInfo *moduleInfo);

emodules& getModules();

//void emoduleLoad(const estr& module);

#endif

