// =============================================================================
//   Dworld の Plugin インタフェースモジュール
// =============================================================================
module dworld.plugin;

/**
 * プラグインが外部に提供するAPI.
 * 外部に提供するAPIクラスは, 本APIを実装してください.
 */
interface PluginApi
{
	/**
	 * プラグインが外部に提供するAPIの名前を返す.
	 * 他のプラグインは、この名前をキーにクラスをロードします.
	 */
	string getName();

}


/**
 * Plugin インタフェース.
 * すべてのプラグインのメインクラスは,
 * 本インタフェースを実装する必要があります.
 */
abstract class Plugin
{

	private
	{
		void* loaderHandle;
	}


	/**
	 * プラグインのメジャーバージョンを返します.
	 *
	 * Return:
	 *	プラグインのメジャーバージョン
	 */
	public
	int getMajorVersion();


	/**
	 * プラグインのマイナーバージョンを返します.
	 *
	 * Return:
	 *	プラグインのマイナーバージョン
	 */
	public
	int getMinorVersion();


	/**
	 * プラグインが開始された際に呼び出されます.
	 */
	public
	void start(PluginContext context);


	/**
	 * プラグインが終了された際に呼び出されます.
	 */
	public
	void stop(PluginContext context);


	/**
	 * ローダーハンドルを設定します.
	 * 本メソッドは、dworld本体より呼び出されます.
	 *
	 * Params:
	 *	handle = ハンドル
	 */
	public
	void setHandle(void* handle)
	{
		this.loaderHandle = handle;
	}


	/**
	 * ローダーハンドルを取得します.
	 * 本メソッドは、dworld本体より呼び出されます.
	 *
	 * Return:
	 *	ハンドル
	 */
	public
	void* getHandle()
	{
		return this.loaderHandle;
	}
}



/**
 * Plugin コンテキスト.
 */
interface PluginContext
{
	/**
	 * 外部に提供するPluginApiを登録します.
	 *
	 * Params:
	 *	api = 外部に提供するPluginApi
	 */
	void registPluginApi(PluginApi api);


	/**
	 * 指定された名前の PluginApi を取得します.
	 *
	 * Params:
	 *	name = PluginApi の名前
	 * Return:
	 *	PluginApi
	 */
	PluginApi getPluginApi(string name);


	/**
	 * 指定された URL より, プラグインをインストールします.
	 *
	 * Params:
	 *	url = URL
	 */
	void installPlugin(string url);


	/**
	 * 指定されたプラグインを開始します.
	 *
	 * Params:
	 *	name = 名前
	 */
	void startPlugin(string name);


	/**
	 * 指定されたプラグインを停止します.
	 *
	 * Params:
	 *	name = 名前
	 */
	void stopPlugin(string name);

}

