#include <string>
#include <map>
class Dynamic_Module
{
	public:
		/**
		 * 	Функция загружает указанный символ, внутри данного модуля, в кеш.
		 * @param  имя символа
		 * @return true в случае успеха.  В случае ошибки причина ошибки может быть получена функцией ME_Dynamic::_get_last_error
		 * @author Messenger of death
		 * @date 17.08.2005
		*/
		bool _symbol_load ( std::string );

		/**
		  * 	Функция удаляет указанный символиз кеша.
		  * @param  имя символа
		  * @return true в случае успеха.
		  * @author Messenger of death
		  * @date 17.08.2005
		   */
		bool _symbol_remove ( std::string );

		/**
		* 	Функция загружает указанный символ, внутри данного модуля, в кеш, если он небыл загружен ранее. И возвращает указатель на него. Синоним для _symbol_get(std::string)
		* @param  имя символа
		* @return указатель на символ, либо 0
		* @author Messenger of death
		* @date 17.08.2005
		*/
		void* operator[] ( std::string );

		/**
		 * 	Функция загружает указанный символ, внутри данного модуля, в кеш, если он небыл загружен ранее. И возвращает указатель на него.
		 * @param  имя символа
		 * @return указатель на символ, либо 0
		 * @author Messenger of death
		 * @date 17.08.2005
		 */
		void* _symbol_get ( std::string );

		/**
		 * 	Функция возвращает указатель на текущий модуль
		 * @return указатель на модуль
		 * @author Messenger of death
		 * @date 17.08.2005
		 */
		void * _module_get() const;
		/**
		 * 	Функция возвращает ссылку на имя модуля
		 * @return ссылка на имя модуля
		 * @author Messenger of death
		 * @date 17.08.2005
		*/
		const std::string& _module_get_name() const;
	private:
		Dynamic_Module ( void *lib, std::string modname )
				: _module_ ( lib )
		{}
		friend bool __module_cache ( void*, std::string );
		void *_module_;
		std::string _module_name_;
		std::map < std::string, void*> _symbols_;
};

/**
* 	Функция загружает указанный модуль в кеш.
* @param  имя модуля
* @return true в случае успеха.  В случае ошибки причина ошибки может быть получена функцией ME_Dynamic::_get_last_error
* @author Messenger of death
* @date 17.08.2005
 */
extern "C" bool module_load ( std::string );

/**
* 	Функция получает загруженный модуль. Если модуль он еще небыл загружен производится его загрузка
 * @param  имя модуля
 * @return Указатель на модуль в случае успеха, иначе 0.
 * @author Messenger of death
 * @date 17.08.2005
*/
extern "C" Dynamic_Module* module_get ( std::string );

/**
  * 	Функция удаляет модуль.  (всегда завершается успехом)
  * @param  имя модуля
  * @return true в случае успеха.
  * @author Messenger of death
  * @date 17.08.2005
 */
extern "C" bool module_remove ( std::string );

/**
  * 	Функция возвращает ссылку на текст предыдущей ошибки.
  * @return текст ошибки. Если ошибки небыло - строка будет пустой.
  * @author Messenger of death
  * @date 17.08.2005
 */
extern "C" std::string dynamic_error();

/**
* Получение версии библиотеки
* @return строку, содержащую версию библиотеки
* @author Messenger of death
* @date 30.08.2005
*/
extern "C" std::string dynamic_version();


