protected function fetchMethodArguments(MethodInvocation $invocation): array
    {
        $result         = [];
        $parameters     = $invocation->getMethod()->getParameters();
        $argumentValues = $invocation->getArguments();

        // Number of arguments can be less than number of parameters because of default values
        foreach ($parameters as $parameterIndex => $reflectionParameter) {
            $hasArgumentValue = \array_key_exists($parameterIndex, $argumentValues);
            $argumentValue    = $hasArgumentValue ? $argumentValues[$parameterIndex] : null;
            if (!$hasArgumentValue && $reflectionParameter->isDefaultValueAvailable()) {
                $argumentValue = $reflectionParameter->getDefaultValue();
            }
            $result[$reflectionParameter->name] = $argumentValue;
        }

        return $result;
    }