getConstructor()) { foreach ($constructor->getParameters() as $parameter) { $specializable[$parameter->getName()] = $this->{$parameter->getName()}; } } return $specializable; } /** * {@inheritdoc} * * @see SpecializableInterface::driver() */ public function driver(): DriverInterface { return $this->driver; } /** * {@inheritdoc} * * @see SpecializableInterface::setDriver() */ public function setDriver(DriverInterface $driver): SpecializableInterface { if (!$this->belongsToDriver($driver)) { throw new DriverException( "Class '" . $this::class . "' can not be used with " . $driver->id() . " driver." ); } $this->driver = $driver; return $this; } /** * Determine if the current object belongs to the given driver's namespace */ protected function belongsToDriver(object $driver): bool { $namespace = function (object $object): string { return (new ReflectionClass($object))->getNamespaceName(); }; return str_starts_with($namespace($this), $namespace($driver)); } }