public function sub($name, $required = true)
{
return new ClosureInvoker(function ($method, $invoker) use($name, $required) {
$arguments = array_slice(func_get_args(), 2);
$arguments[0] = $name . '.' . $arguments[0];
if ($method != 'sub' && strpos($arguments[0], '.')) {
$p = preg_replace('/\\.[^\\.]+$/', '', $arguments[0]);
if ($required) {
$obj = new \stdClass();
$invoker->getObject()->setParameter($p, $obj);
}
$invoker->getObject()->paths[$p] = true;
}
$ret = call_user_func_array(array($invoker->getObject(), $method), $arguments);
if ($ret instanceof ClosureInvoker) {
$ret->parent = $invoker;
return $ret;
} else {
return $invoker;
}
}, $this);
}