<?php
/**
* モジュールに処理を移譲するタスク
*
* PHP version 5
*
* @package    tasks
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class ModuleDelegateTask extends Task implements ITask
{
	private $_params;
	private $_module;
	private $_action;
	private $_ret_prop;


	/*
	 *    コンストラクタ
	 */
	public function __construct()
	{
		parent::__construct();

		$this->_params = array();
		$this->_module = NULL;
		$this->_action = NULL;
	}

	/**
	 * タスクを初期化する
	 */
	public function init( Config $config )
	{
		parent::init($config);

		$this->_module     = $config->getString( s('module') );
		$this->_action     = $config->getString( s('action') );
		$this->_ret_prop   = $config->getString( s('ret_prop') );
	}

	/**
	 * パラメータのキー一覧を取得する
	 */
	public function getKeys()
	{
		return array_keys( $this->_params );
	}

	/**
	 * パラメータを取得する
	 */
	public function get( $key )
	{
		return isset($this->_params[$key]) ? $this->_params[$key] : NULL;
	}

	/**
	 * パラメータを設定する
	 */
	public function set( $key, $value )
	{
		$this->_params[$key] = $value;
	}

	/**
	 * イベントを処理する
	 */
	public function processEvent( IEvent $event, TaskSnapshot $snapshot )
	{
		$module_name = $this->_module;
		if ( $module_name && !$module_name->isEmpty() ){
			// モジュールを作成
			$module = Factory::createModule( $module_name );
			// 呼び出す
			$ret = $module->execute( $this->_action, $event );
			// リターンプロパティが設定されているなら、セットする
			if ( $this->_ret_prop && !$this->_ret_prop->isEmpty() ){
				$prop = $this->_ret_prop->getValue();
				$this->$prop = $ret;
			}
		}

		return b(TRUE);
	}

}

return __FILE__;