public final function __invoke(array $arguments = [], array $variadicArguments = [])
{
if ($this->level) {
array_push($this->stackFrames, [$this->arguments, $this->current]);
}
if (!empty($variadicArguments)) {
$arguments = array_merge($arguments, $variadicArguments);
}
++$this->level;
$this->current = 0;
$this->arguments = $arguments;
$result = $this->proceed();
--$this->level;
if ($this->level) {
list($this->arguments, $this->current) = array_pop($this->stackFrames);
}
return $result;
}