name = $name; $this->handler = $handler; } public function getName(): string { return $this->name; } public function call(Context $context): PromiseInterface { return new Promise(function (callable $resolve) use ($context) { $args = $context->toMethodParameters($this->handler); $resolve(call_user_func($this->handler, ...$args)); //$resolve(call_user_func($this->handler, $context)); return; }); } public function parameters(): array { $refl = new ReflectionFunction($this->handler); $args = []; foreach ($refl->getParameters() as $parameter) { $name = $parameter->getName(); $type = null; if (!$parameter->hasType()) { $type = 'any'; } else { $type = $parameter->getType(); if ($type instanceof ReflectionNamedType && $type->isBuiltin()) { $type = ($type->allowsNull() ? "?" : "") . $type->getName(); } else { $type = null; } } if ($parameter->isDefaultValueAvailable()) $type = "{$type}=".\json_encode($parameter->getDefaultValue(),\JSON_UNESCAPED_SLASHES); if ($type !== null) $args[$name] = $type; } return $args; } }