. */ declare(strict_types=1); namespace Fisharebest\Webtrees; use Illuminate\Container\Container; use ReflectionClass; use ReflectionMethod; use ReflectionParameter; use function array_map; /** * Application container. */ class Application extends Container { /** * Call an object's method, injecting all its dependencies. * * @param object $object * @param string $method * * @return mixed */ public function dispatch($object, string $method) { $reflector = new ReflectionMethod($object, $method); $parameters = $this->makeParameters($reflector->getParameters()); return $reflector->invoke($object, ...$parameters); } /** * @param array $parameters * * @return array */ private function makeParameters(array $parameters): array { return array_map(function (ReflectionParameter $parameter) { $class = $parameter->getClass(); if ($class instanceof ReflectionClass) { return $this->make($class->getName()); } if ($parameter->isDefaultValueAvailable()) { return $parameter->getDefaultValue(); } return null; }, $parameters); } }