public function __call($name, array $args)
{
if (isset($this->methodCache[$name])) {
$method = $this->methodCache[$name];
return call_user_func_array($method, $args);
}
$n = count($args);
if ($n > 0) {
if ($args[$n - 1] instanceof Closure) {
$callback = array_pop($args);
return $this->invoke($name, $args, $callback);
} else {
if ($args[$n - 1] instanceof InvokeSettings) {
if ($n > 1 && $args[$n - 2] instanceof Closure) {
$settings = array_pop($args);
$callback = array_pop($args);
return $this->invoke($name, $args, $callback, $settings);
}
$settings = array_pop($args);
return $this->invoke($name, $args, $settings);
} else {
if ($n > 1 && is_array($args[$n - 1]) && $args[$n - 2] instanceof Closure) {
$settings = new InvokeSettings(array_pop($args));
$callback = array_pop($args);
return $this->invoke($name, $args, $callback, $settings);
}
}
}
}
return $this->invoke($name, $args);
}