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