<?php

declare(strict_types=1);

namespace Laminas\Cache\Pattern;

use Laminas\Cache\Exception\InvalidArgumentException;
use Psr\Container\ContainerInterface;
use function class_exists;

/**
 * @deprecated This will be removed with v3.0.0 as providing generic factories for cache patterns wont be suitable for
 *             all possible combinations of implemented upstream patterns.
 */
final class PatternCacheFactory
{
    /**
     * @template T of PatternInterface
     * @psalm-param class-string<T>             $requestedName
     */
    public function __invoke(
        ContainerInterface $container,
        string $requestedName,
        array $options = null
    ): PatternInterface {
        if (! class_exists($requestedName)) {
            throw new InvalidArgumentException(sprintf(
                'Factory %s is used for a service %s which does not exist.'
                . ' Please only use this factory for services with full qualified class names!',
                self::class,
                $requestedName
            ));
        }

        $patternOptions = new PatternOptions($options);
        return new $requestedName($patternOptions);
    }
}