public function call(MethodArgumentDocument $methodArgument)
    {
        $serviceName = $methodArgument->getMethod()->getService()->getServiceName();
        $service = $this->container->get($serviceName);
        if (null === $service) {
            throw new UndefinedServiceException(sprintf('"%s" is not a service', $serviceName));
        }

        $methodName = $methodArgument->getMethod()->getName();
        try {
            $r = new \ReflectionMethod($service, $methodName);
        } catch (\ReflectionException $e) {
            throw new BadMethodCallException(sprintf('"%s" is not a method in %s', $methodName, $serviceName));
        }

        $methodArguments = $methodArgument->getArguments();
        $numberOfArgs = $methodArguments->count();

        $minArgs = $r->getNumberOfRequiredParameters();
        $maxArgs = $r->getNumberOfParameters();
        if ($numberOfArgs < $minArgs || $numberOfArgs > $maxArgs) {
            $range = $minArgs === $maxArgs ? $minArgs : "$minArgs-$maxArgs";
            throw new WrongNumberOfArgumentsException(
                sprintf('Method "%s" in %s expects %s arguments, got %d', $methodName, $serviceName, $range, $numberOfArgs)
            );
        }

        return $service->$methodName(...$this->buildArgumentArray($r->getParameters(), $methodArguments));
    }