protected function callAction(ControllerInterface $class, $action, $arguments, array $data)
    {
        if (null !== $this->action || $this->action->getName() !== $this->action) {
            $this->action = new \ReflectionMethod($class, $action);
        }

        $params = [];

        $dataBox = new Param($data);

        foreach ($arguments as $argument) {
            $params[$argument->name] = $dataBox->get($argument->name, $argument->defaultValue);
        }

        return $this->action->invokeArgs($class, $params);
    }