definition; $arguments = array_map( fn (ParameterDefinition $parameter) => Argument::fromParameter($parameter), array_values([...$definition->parameters]) ); $this->isDynamicConstructor = $definition->attributes->has(DynamicConstructor::class); if ($this->isDynamicConstructor) { array_shift($arguments); } $this->function = $function; $this->className = $type->className(); $this->arguments = new Arguments(...$arguments); } public function describeArguments(): Arguments { return $this->arguments; } public function buildObject(array $arguments): object { $parameters = $this->function->definition->parameters; if ($this->isDynamicConstructor) { $arguments[$parameters->at(0)->name] = $this->className; } $arguments = new MethodArguments($parameters, $arguments); try { /** @var object */ return ($this->function->callback)(...$arguments); } catch (Exception $exception) { throw UserlandError::from($exception); } } public function signature(): string { return $this->function->definition->signature; } }