Skip to content

Commit

Permalink
Add event trap listener
Browse files Browse the repository at this point in the history
  • Loading branch information
mleko committed Sep 27, 2016
1 parent a539831 commit d98a206
Show file tree
Hide file tree
Showing 2 changed files with 97 additions and 0 deletions.
58 changes: 58 additions & 0 deletions src/Listener/EventTrap.php
@@ -0,0 +1,58 @@
<?php
/**
* @package event
*/


namespace Mleko\Event\Listener;


class EventTrap implements \Mleko\Event\Listener
{

/** @var object[] */
private $trappedEvents;

/** @var boolean */
private $oneTime;

/**
* EventTrap constructor.
* @param bool $oneTime
*/
public function __construct($oneTime = true)
{
$this->oneTime = $oneTime;
$this->trappedEvents = [];
}


/**
* @param object $event
* @param \Mleko\Event\Meta $meta
*/
public function handle($event, \Mleko\Event\Meta $meta)
{
if ($this->oneTime && $this->trappedEvents) {
return;
}
$this->trappedEvents[] = $event;
}

/**
* @return object[]
*/
public function getTrappedEvents()
{
return $this->trappedEvents;
}

/**
* @return null|object
*/
public function getFirstEvent()
{
return isset($this->trappedEvents[0]) ? $this->trappedEvents[0] : null;
}

}
39 changes: 39 additions & 0 deletions tests/Listener/EventTrapTest.php
@@ -0,0 +1,39 @@
<?php
/**
* @package event
*/


namespace Mleko\Event\Tests\Listener;


class EventTrapTest extends \PHPUnit_Framework_TestCase
{
public function testMultipleEvents()
{
$emitter = new \Mleko\Event\SimpleEmitter(new \Mleko\Event\EventNameExtractor\ClassNameExtractor());

$emitter->addListener('ArrayObject', $trap = new \Mleko\Event\Listener\EventTrap(false));

$emitter->emit($event1 = new \ArrayObject());
$emitter->emit($event2 = new \ArrayObject());

$this->assertEquals(2, count($trap->getTrappedEvents()));
$this->assertContains($event1, $trap->getTrappedEvents());
$this->assertContains($event2, $trap->getTrappedEvents());
}

public function testOneTimeTrap()
{
$emitter = new \Mleko\Event\SimpleEmitter(new \Mleko\Event\EventNameExtractor\ClassNameExtractor());

$emitter->addListener('ArrayObject', $trap = new \Mleko\Event\Listener\EventTrap());

$emitter->emit($event1 = new \ArrayObject());
$emitter->emit($event2 = new \ArrayObject());

$this->assertEquals(1, count($trap->getTrappedEvents()));
$this->assertContains($event1, $trap->getTrappedEvents());
$this->assertSame($event1, $trap->getFirstEvent());
}
}

0 comments on commit d98a206

Please sign in to comment.