/** * Builds an instance of the given type. * * @param string $type * @param mixed[] $arguments * @param bool $isSingleton * * @return object */ private function buildInstance($type, array $arguments = [], $isSingleton = true) { $class = $type; if (isset($this->interfaces[$class])) { $class = $this->interfaces[$class]; } $key = $this->buildKey($class, $arguments); if ($isSingleton && isset($this->objects[$key])) { return $this->objects[$class]; } if (isset($this->processing[$class])) { return; } $this->processing[$class] = true; if (isset($this->factories[$class])) { $factory = $this->factories[$class]; $parameters = $this->resolveObjects($this->reflector->resolveFunctionParameters($factory, $arguments), 'Closure'); $result = $factory(...$parameters); } else { if (!$this->reflector->isInstantiable($class)) { throw new \RuntimeException(sprintf('"%s" is not instantiable.', $class)); } $parameters = $this->resolveObjects($this->reflector->resolveMethodParameters($class, '__construct', $arguments), $class); $result = new $class(...$parameters); } if ($isSingleton) { $this->registerInstance($key, $result); } unset($this->processing[$class]); return $result; }