<?php
/**
 * -----------------------------------------------------------------------------
 *
 * SyL - Web Application Framework for PHP
 *
 * PHP version 4 (>= 4.3.x) or 5
 *
 * Copyright (C) 2006 k.watanabe
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * -----------------------------------------------------------------------------
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_RequestParameter.php,v 1.2 2006/12/25 17:30:18 seasonstream Exp $
 * @link      http://www.syl.jp/
 * -----------------------------------------------------------------------------
 */

/**
 * パラメータ保持クラス
 * 
 * @package   SyL
 * @author    k.watanabe <k.watanabe@syl.jp>
 * @copyright 2006 k.watanabe
 * @license   http://www.opensource.org/licenses/lgpl-license.php
 * @version   CVS: $Id: SyL_RequestParameter.php,v 1.2 2006/12/25 17:30:18 seasonstream Exp $
 * @link      http://www.syl.jp/
 */
class SyL_RequestParameter
{
    /**
     * パラメータ配列
     * 
     * @access protected
     */
    var $parameters = array();

    /**
     * パラメータ存在判定
     * 
     * @access public
     * @param string パラメータ名
     * @return 存在する: true, 存在しない: false
     */
    function isParameter($name)
    {
        $arg_list = func_get_args();
        return (call_user_func_array(array(&$this, 'getParameterRecursive'), $arg_list) !== null);
    }

    /**
     * パラメータをセット
     * 
     * @access public
     * @param string パラメータ名
     * @param string パラメータ値
     */
    function setParameter($name, $value)
    {
        $this->parameters[$name] = $value;
    }

    /**
     * パラメータ取得
     * 
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getParameter($name)
    {
        $arg_list = func_get_args();
        return call_user_func_array(array(&$this, 'getParameterRecursive'), $arg_list);
    }


    /**
     * 全パラメータ取得
     * 
     * @access public
     * @return array 全パラメータ
     */
    function &getParameterAll()
    {
        return $this->parameters;
    }

    /**
     * パラメータを削除
     * 
     * @access public
     * @param string パラメータ名
     */
    function deleteParameter($name)
    {
        if (isset($this->parameters[$name])) {
            unset( $this->parameters[$name] );
        }
    }

    /**
     * 全パラメータ削除
     * 
     * @access public
     */
    function deleteParameterAll()
    {
        $this->parameters = array();
    }

    /**
     * パラメータ再帰取得
     * 
     * @access public
     * @param string パラメータ名
     * @return mixed パラメータ値
     */
    function getParameterRecursive($parameter_name)
    {
        static $value = null;
        $arg_list = func_get_args();

        if ($value === null) {
            $name = array_shift($arg_list);
            if (isset($this->parameters[$name])) {
                $value = $this->parameters[$name];
            } else {
                return null;
            }
        }

        if (count($arg_list) > 0) {
            $name = array_shift($arg_list);
            if (isset($value[$name])) {
                $value = $value[$name];
                return call_user_func_array(array(&$this, 'getParameterRecursive'), $arg_list);
            } else {
                return null;
            }
        } else {
            $return_value = $value;
            $value = null;
            return $return_value;
        }
    }

    /**
     * 全パラメータに指定関数を適用する
     * 
     * @access private
     * @param array パラメータ配列
     * @param string 関数名
     */
    function applyParameters($func)
    {
        $func_parameters = func_get_args();
        $this->applyParametersRecursive($this->parameters, $func_parameters);
    }

    /**
     * 全パラメータに指定関数を適用する
     * 
     * @access private
     * @param array パラメータ配列
     * @param string 関数名
     */
    function applyParametersRecursive(&$parameters, $args)
    {
        if (is_array($parameters)) {
            foreach($parameters as $key => $value) {
                $this->applyParametersRecursive($parameters[$key], $args);
            }
        } else {
            // とりあえず、文字列型のみ適用
            if (is_string($parameters)) {
                $func_name = array_shift($args);
                $parameters = call_user_func_array($func_name, array_merge((array)$parameters, $args));
            }
        }
    }

}

?>
