Skip to content
This repository has been archived by the owner on Jan 29, 2020. It is now read-only.

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
Prepping for 2.2.0RC1.
  • Loading branch information
weierophinney committed May 1, 2013
Show file tree
Hide file tree
Showing 8 changed files with 279 additions and 2 deletions.
34 changes: 34 additions & 0 deletions src/AbstractListenerAggregate.php
@@ -0,0 +1,34 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\EventManager;


/**
* Abstract aggregate listener
*/
abstract class AbstractListenerAggregate implements ListenerAggregateInterface
{
/**
* @var \Zend\Stdlib\CallbackHandler[]
*/
protected $listeners = array();

/**
* {@inheritDoc}
*/
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $callback) {
if ($events->detach($callback)) {
unset($this->listeners[$index]);
}
}
}
}
4 changes: 4 additions & 0 deletions src/ListenerAggregateInterface.php
Expand Up @@ -26,13 +26,17 @@ interface ListenerAggregateInterface
* implementation will pass this to the aggregate.
*
* @param EventManagerInterface $events
*
* @return void
*/
public function attach(EventManagerInterface $events);

/**
* Detach all previously attached listeners
*
* @param EventManagerInterface $events
*
* @return void
*/
public function detach(EventManagerInterface $events);
}
34 changes: 34 additions & 0 deletions src/ListenerAggregateTrait.php
@@ -0,0 +1,34 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
*/

namespace Zend\EventManager;

/**
* Provides logic to easily create aggregate listeners, without worrying about
* manually detaching events
*/
trait ListenerAggregateTrait
{
/**
* @var \Zend\Stdlib\CallbackHandler[]
*/
protected $listeners = array();

/**
* {@inheritDoc}
*/
public function detach(EventManagerInterface $events)
{
foreach ($this->listeners as $index => $callback) {
if ($events->detach($callback)) {
unset($this->listeners[$index]);
}
}
}
}
2 changes: 0 additions & 2 deletions src/StaticEventManager.php
Expand Up @@ -22,8 +22,6 @@ class StaticEventManager extends SharedEventManager

/**
* Singleton
*
* @return void
*/
protected function __construct()
{
Expand Down
71 changes: 71 additions & 0 deletions test/AbstractListenerAggregateTest.php
@@ -0,0 +1,71 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_EventManager
*/

namespace ZendTest\EventManager;

use ZendTest\EventManager\TestAsset\MockAbstractListenerAggregate;

/**
* @category Zend
* @package Zend_EventManager
* @subpackage UnitTests
* @group Zend_EventManager
*/
class AbstractListenerAggregateTest extends \PHPUnit_Framework_TestCase
{
/**
* @var \ZendTest\EventManager\TestAsset\MockAbstractListenerAggregate
*/
protected $listener;

/**
* {@inheritDoc}
*/
public function setUp()
{
$this->listener = new MockAbstractListenerAggregate();
}

/**
* @covers \Zend\EventManager\AbstractListenerAggregate::detach
*/
public function testDetach()
{
$eventManager = $this->getMock('Zend\\EventManager\\EventManagerInterface');
$unrelatedEventManager = $this->getMock('Zend\\EventManager\\EventManagerInterface');
$callbackHandlers = array();
$test = $this;

$eventManager
->expects($this->exactly(2))
->method('attach')
->will($this->returnCallback(function () use (&$callbackHandlers, $test) {
return $callbackHandlers[] = $test->getMock('Zend\\Stdlib\\CallbackHandler', array(), array(), '', false);
}));

$this->listener->attach($eventManager);
$this->assertSame($callbackHandlers, $this->listener->getCallbacks());

$this->listener->detach($unrelatedEventManager);

$this->assertSame($callbackHandlers, $this->listener->getCallbacks());

$eventManager
->expects($this->exactly(2))
->method('detach')
->with($this->callback(function ($callbackHandler) use ($callbackHandlers) {
return in_array($callbackHandler, $callbackHandlers, true);
}))
->will($this->returnValue(true));

$this->listener->detach($eventManager);
$this->assertEmpty($this->listener->getCallbacks());
}
}
56 changes: 56 additions & 0 deletions test/ListenerAggregateTraitTest.php
@@ -0,0 +1,56 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_EventManager
*/

namespace ZendTest\EventManager;

use ZendTest\EventManager\TestAsset\MockListenerAggregateTrait;

/**
* @requires PHP 5.4
*/
class ListenerAggregateTraitTest extends \PHPUnit_Framework_TestCase
{
/**
* @covers \Zend\EventManager\ListenerAggregateTrait::detach
*/
public function testDetach()
{
$listener = new MockListenerAggregateTrait();
$eventManager = $this->getMock('Zend\\EventManager\\EventManagerInterface');
$unrelatedEventManager = $this->getMock('Zend\\EventManager\\EventManagerInterface');
$callbackHandlers = array();
$test = $this;

$eventManager
->expects($this->exactly(2))
->method('attach')
->will($this->returnCallback(function () use (&$callbackHandlers, $test) {
return $callbackHandlers[] = $test->getMock('Zend\\Stdlib\\CallbackHandler', array(), array(), '', false);
}));

$listener->attach($eventManager);
$this->assertSame($callbackHandlers, $listener->getCallbacks());

$listener->detach($unrelatedEventManager);

$this->assertSame($callbackHandlers, $listener->getCallbacks());

$eventManager
->expects($this->exactly(2))
->method('detach')
->with($this->callback(function ($callbackHandler) use ($callbackHandlers) {
return in_array($callbackHandler, $callbackHandlers, true);
}))
->will($this->returnValue(true));

$listener->detach($eventManager);
$this->assertEmpty($listener->getCallbacks());
}
}
40 changes: 40 additions & 0 deletions test/TestAsset/MockAbstractListenerAggregate.php
@@ -0,0 +1,40 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_EventManager
*/

namespace ZendTest\EventManager\TestAsset;

use Zend\EventManager\AbstractListenerAggregate;
use Zend\EventManager\EventManagerInterface;

/**
* @category Zend
* @package Zend_EventManager
* @subpackage UnitTests
* @group Zend_EventManager
*/
class MockAbstractListenerAggregate extends AbstractListenerAggregate
{
public $priority;

public function attach(EventManagerInterface $events)
{
$this->listeners[] = $events->attach('foo.bar', array($this, 'doFoo'));
$this->listeners[] = $events->attach('foo.baz', array($this, 'doFoo'));
}

public function getCallbacks()
{
return $this->listeners;
}

public function doFoo()
{
}
}
40 changes: 40 additions & 0 deletions test/TestAsset/MockListenerAggregateTrait.php
@@ -0,0 +1,40 @@
<?php
/**
* Zend Framework (http://framework.zend.com/)
*
* @link http://github.com/zendframework/zf2 for the canonical source repository
* @copyright Copyright (c) 2005-2013 Zend Technologies USA Inc. (http://www.zend.com)
* @license http://framework.zend.com/license/new-bsd New BSD License
* @package Zend_EventManager
*/

namespace ZendTest\EventManager\TestAsset;

use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\ListenerAggregateTrait;

/**
* @category Zend
* @package Zend_EventManager
* @subpackage UnitTests
* @group Zend_EventManager
*/
class MockListenerAggregateTrait
{
use ListenerAggregateTrait;

public function attach(EventManagerInterface $events)
{
$this->listeners[] = $events->attach('foo.bar', array($this, 'doFoo'));
$this->listeners[] = $events->attach('foo.baz', array($this, 'doFoo'));
}

public function getCallbacks()
{
return $this->listeners;
}

public function doFoo()
{
}
}

0 comments on commit f7ed875

Please sign in to comment.