/**
 * Aufruf einer Funtion (Class-Member oder statische Funktion)
 *
 * @param $function Name der Callback-Funktion
 * @param $params Parameter für die Funktion
 *
 * @example
 *   rex_call_func( 'myFunction', array( 'Param1' => 'ab', 'Param2' => 12))
 * @example
 *   rex_call_func( 'myObject::myMethod', array( 'Param1' => 'ab', 'Param2' => 12))
 * @example
 *   rex_call_func( array('myObject', 'myMethod'), array( 'Param1' => 'ab', 'Param2' => 12))
 * @example
 *   $myObject = new myObject();
 *   rex_call_func( array($myObject, 'myMethod'), array( 'Param1' => 'ab', 'Param2' => 12))
 */
function rex_call_func($function, $params, $parseParamsAsArray = true)
{
    $func = '';
    if (is_string($function) && strlen($function) > 0) {
        // static class method
        if (strpos($function, '::') !== false) {
            preg_match('!(\\w+)::(\\w+)!', $function, $_match = array());
            $_class_name = $_match[1];
            $_method_name = $_match[2];
            rex_check_callable($func = array($_class_name, $_method_name));
        } elseif (function_exists($function)) {
            $func = $function;
        } else {
            trigger_error('rexCallFunc: Function "' . $function . '" not found!', E_USER_ERROR);
        }
    } elseif (is_array($function)) {
        $_object = $function[0];
        $_method_name = $function[1];
        rex_check_callable($func = array($_object, $_method_name));
    } else {
        trigger_error('rexCallFunc: Using of an unexpected function var "' . $function . '"!');
    }
    if ($parseParamsAsArray === true) {
        // Alle Parameter als ein Array übergeben
        // funktion($params);
        return call_user_func($func, $params);
    }
    // Jeder index im Array ist ein Parameter
    // funktion($params[0], $params[1], $params[2],...);
    return call_user_func_array($func, $params);
}
/**
 * Aufruf einer Funtion (Class-Member oder statische Funktion)
 *
 * @param $function Name der Callback-Funktion
 * @param $params Parameter für die Funktion
 * 
 * @example 
 *   rex_call_func( 'myFunction', array( 'Param1' => 'ab', 'Param2' => 12))
 * @example 
 *   rex_call_func( 'myObject::myMethod', array( 'Param1' => 'ab', 'Param2' => 12))
 * @example 
 *   rex_call_func( array('myObject', 'myMethod'), array( 'Param1' => 'ab', 'Param2' => 12))
 * @example 
 *   $myObject = new myObject();
 *   rex_call_func( array($myObject, 'myMethod'), array( 'Param1' => 'ab', 'Param2' => 12))
 */
function rex_call_func($function, $params)
{
    $func = '';
    if (is_string($function) && strlen($function) > 0) {
        // static class method
        if (strpos($function, '::') !== false) {
            preg_match('!(\\w+)::(\\w+)!', $function, $_match = array());
            $_class_name = $_match[1];
            $_method_name = $_match[2];
            rex_check_callable($func = array($_class_name, $_method_name));
        } elseif (function_exists($function)) {
            $func = $function;
        } else {
            trigger_error('rexExtension: Function "' . $function . '" not found!');
        }
    } elseif (is_array($function)) {
        $_object = $function[0];
        $_method_name = $function[1];
        rex_check_callable($func = array($_object, $_method_name));
    } else {
        trigger_error('rexExtension: Using of an unexpected function var "' . $function . '"!');
    }
    return call_user_func($func, $params);
}