<?php

namespace Laminas\Session\Validator;

use Laminas\EventManager\EventManager;
use Laminas\Session\Storage\StorageInterface;
use Laminas\Stdlib\CallbackHandler;

/**
 * Abstract validator chain for validating sessions (for use with laminas-eventmanager v3)
 *
 * @deprecated Use {@see \Laminas\Session\ValidatorChain} directly
 */
abstract class AbstractValidatorChainEM3 extends EventManager
{
    use ValidatorChainTrait;

    /**
     * Construct the validation chain
     *
     * Retrieves validators from session storage and attaches them.
     *
     * Duplicated in ValidatorChainEM2 to prevent trait collision with parent.
     */
    public function __construct(StorageInterface $storage)
    {
        parent::__construct();

        $this->storage = $storage;
        $validators    = $storage->getMetadata('_VALID');
        if ($validators) {
            foreach ($validators as $validator => $data) {
                $this->attachValidator('session.validate', [new $validator($data), 'isValid'], 1);
            }
        }
    }

    /**
     * Attach a listener to the session validator chain.
     *
     * @param string $eventName
     * @param int $priority
     * @return CallbackHandler
     */
    public function attach($eventName, callable $listener, $priority = 1)
    {
        return $this->attachValidator($eventName, $listener, $priority);
    }
}
