public function uriFor($actionName, $controllerArguments = [], $controllerName = null, $packageKey = null, $subPackageKey = null)
    {
        if ($actionName === null || $actionName === '') {
            throw new Exception\MissingActionNameException('The URI Builder could not build a URI linking to an action controller because no action name was specified. Please check the stack trace to see which code or template was requesting the link and check the arguments passed to the URI Builder.', 1354629891);
        }
        $controllerArguments['@action'] = strtolower($actionName);
        if ($controllerName !== null) {
            $controllerArguments['@controller'] = strtolower($controllerName);
        } else {
            $controllerArguments['@controller'] = strtolower($this->request->getControllerName());
        }
        if ($packageKey === null && $subPackageKey === null) {
            $subPackageKey = $this->request->getControllerSubpackageKey();
        }
        if ($packageKey === null) {
            $packageKey = $this->request->getControllerPackageKey();
        }
        $controllerArguments['@package'] = strtolower($packageKey);
        if ($subPackageKey !== null) {
            $controllerArguments['@subpackage'] = strtolower($subPackageKey);
        }
        if ($this->format !== null && $this->format !== '') {
            $controllerArguments['@format'] = $this->format;
        }

        $controllerArguments = $this->addNamespaceToArguments($controllerArguments, $this->request);
        return $this->build($controllerArguments);
    }