for testing and deploying your application
for finding and fixing issues
for empowering human code reviews
<?php
/**
* File was created 19.03.2015 08:39
*
* @author Karsten J. Gerber <[email protected]>
*/
namespace PeekAndPoke\Component\Emitter;
use PeekAndPoke\Component\Psi\UnaryFunction;
* Emitter
class EmitterImpl implements Emitter
{
/** @var bool */
private $enabled = true;
/** @var \SplObjectStorage[] */
private $bindings = [];
* @param bool $enabled
public function enable($enabled = true)
$this->enabled = $enabled;
}
* {@inheritdoc}
public function bind($eventName, $handler)
if (! self::isListener($handler)) {
throw new \LogicException('Invalid listener');
if (false === array_key_exists($eventName, $this->bindings)) {
$this->bindings[$eventName] = new \SplObjectStorage();
$listeners = $this->bindings[$eventName];
if (! $listeners->offsetExists($handler)) {
$listeners->offsetSet($handler);
return $this;
public function emit(Event $event)
if ($this->enabled === false) {
/** @var callable[] $listeners */
$listeners = $this->bindings[$event->getEventName()] ?? [];
foreach ($listeners as $listener) {
$listener($event);
* @param Listener|UnaryFunction|callable $listener
* @return bool
public static function isListener($listener)
return $listener instanceof \Closure ||
$listener instanceof Listener ||
\is_callable($listener);