public function render() {
        $args = func_get_args();
        if (isset($args[0]) && is_string($args[0])) {
            $tpl = array_shift($args);
        } else {
            $tpl = get_class($this);
            $paths = explode('\\', $tpl);
            array_shift($paths);
            $className = array_pop($paths);
            $actionSuffix = 'Action';
            if (substr($className, strrpos($className, $actionSuffix)) === $actionSuffix) {
                $basename = substr($className, 0, -strlen($actionSuffix));
            } else {
                $basename = $className;
            }
            array_push($paths, $basename);
            foreach ($paths as &$path) {
                $path = Toolkit::to_snake_case($path);
            }
            unset($path);
            $tpl = implode(DIRECTORY_SEPARATOR, $paths);
        }
        if (isset($args[0]) && is_array($args[0])) {
            $params = array_shift($args);
        } else {
            $params = [];
        }
        if (isset($args[0]) && is_string($args[0])) {
            $cacheId = array_shift($args);
        } else {
            $cacheId = '';
        }

        return $this->view->render($tpl, $params, $cacheId);
    }