public function rawDispatch($command = null, array $source = null) {
		// Check for valid commands
		if ( $command !== null )
			;
		elseif ( isset($_REQUEST[$this->cmdVar]) )
			$command = $_REQUEST[$this->cmdVar];
		else
			throw new Exception('No command specified!');

		if ( !isset($this->actions[$command]) )
			throw new Exception('Unknown command: '.$command);

		// array(COMMAND => array(METHOD[post, get, all], FUNCTION, PARAM1, PARAM2, ...))
		$functionSpec = $this->actions[$command];
		$method       = strtoupper(array_shift($functionSpec));
		$function     = array_shift($functionSpec);

		if ( $source === null ) {
			switch( $method ) {
				case 'GET':
					$source = $_GET;
					break;
				case 'POST':
					$source = $_POST;
					break;
			case 'PUT':
			case 'DELETE':
				parse_str(file_get_contents('php://input'), $source);
				break;
			default:
				$source = $_REQUEST;
				break;
			}
		}

		// Get the function parameters
		$parameters = array();
		if ( sizeof($functionSpec) > 0 ) {
			foreach ($functionSpec[0] as $param) {
				if ( !is_array($param) ) {
					$parameters[] = $this->initParam($source, $param);
				} else {
					$type    = ( (isset($param[1]) and array_key_exists(1, $param)) ? $param[1] : 'string' );
					$default = ( (isset($param[2]) and array_key_exists(2, $param)) ? $param[2] : null );
					$required = ( isset($param[3]) ? (bool)$param[3] : true );
					$parameters[] = $this->initParam($source, $param[0], $type, $default, $required);
				}
			}
		}
		$res = call_user_func_array(array($this, $this->prefix.$function), $parameters);

		// Check if the result should be wrapped into a JSON-encoded object
		// (by "runJSON()").
		if ( $res instanceof VoidResult )
			return null;

		return (is_array($res) && (isset($res['result']) || isset($res['error']))) ? $res : array('result' => $res);
	}