<?php

namespace Laminas\EventManager;

/**
 * Interface for shared event listener collections
 */
interface SharedEventManagerInterface
{
    /**
     * Attach a listener to an event emitted by components with specific identifiers.
     *
     * @param  string $identifier Identifier for event emitting component
     * @param  string $eventName
     * @param  callable $listener Listener that will handle the event.
     * @param  int $priority Priority at which listener should execute
     */
    public function attach($identifier, $eventName, callable $listener, $priority = 1);

    /**
     * Detach a shared listener.
     *
     * Allows detaching a listener from one or more events to which it may be
     * attached.
     *
     * @param  callable $listener Listener to detach.
     * @param  null|string $identifier Identifier from which to detach; null indicates
     *      all registered identifiers.
     * @param  null|string $eventName Event from which to detach; null indicates
     *      all registered events.
     * @throws Exception\InvalidArgumentException For invalid identifier arguments.
     * @throws Exception\InvalidArgumentException For invalid event arguments.
     */
    public function detach(callable $listener, $identifier = null, $eventName = null);

    /**
     * Retrieve all listeners for given identifiers
     *
     * @param  array $identifiers
     * @param  string $eventName
     * @return array
     */
    public function getListeners(array $identifiers, $eventName);

    /**
     * Clear all listeners for a given identifier, optionally for a specific event
     *
     * @param  string $identifier
     * @param  null|string $eventName
     */
    public function clearListeners($identifier, $eventName = null);
}
