diff --git a/composer.json b/composer.json index 940919e..c648e64 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "scripts": { "test": [ "find src -name '*.php' -exec php -l {} \\;", - "./vendor/bin/phpunit --bootstrap vendor/autoload.php tests/BaseMediatorTest" + "./vendor/bin/phpunit --bootstrap vendor/autoload.php tests" ] }, "autoload": { diff --git a/src/BaseMediator.php b/src/BaseMediator.php index fffe868..611210c 100644 --- a/src/BaseMediator.php +++ b/src/BaseMediator.php @@ -2,15 +2,8 @@ namespace montefuscolo; class BaseMediator { - private static $instance = null; private $filters = null; private $actions = null; - private $prefix = 'root:'; - - private function __construct() { - $this->filters = array(); - $this->actions = array(); - } private function add(&$chain, $name, $callback, $priority) { if (empty($chain[ $name ])) { @@ -40,6 +33,7 @@ private function run(&$chain, $name, $subject=null) { return $subject; } + $result = null; $filtering = $this->filters === $chain; $subject = array_slice(func_get_args(), 2); @@ -56,18 +50,12 @@ private function run(&$chain, $name, $subject=null) { } } - return $subject; + return $result; } - private function get_hook_name($name) { - return $this->prefix . $name; - } - - public static function getInstance() { - if (self::$instance === null) { - self::$instance = new self(); - } - return self::$instance; + public function __construct() { + $this->filters = array(); + $this->actions = array(); } public function add_filter($name, $callback, $priority=10) { @@ -87,33 +75,10 @@ public function remove_action($name, $func=null) { } public function run_filters($name, $subject=null) { - if (empty($this->filters[ $name ])) { - return $subject; - } - - usort($this->filters[ $name ], function($a, $b) { - return $a[1] === $b[1] ? 0 : ( $a[1] < $b[1] ? -1 : 1 ); - }); - - foreach ($this->filters[ $name ] as $function) { - list($callback, $priority) = $function; - $subject = call_user_func($callback, $subject); - } - return $subject; + return $this->run($this->filters, $name, $subject); } public function run_actions($name, $subject=null) { - if (empty($this->actions[ $name ])) { - return $subject; - } - - usort($this->actions[ $name ], function($a, $b) { - return $a[1] === $b[1] ? 0 : ( $a[1] < $b[1] ? -1 : 1 ); - }); - - foreach ($this->actions[ $name ] as $function) { - list($callback, $priority) = $function; - call_user_func($callback, $subject); - } + return $this->run($this->actions, $name, $subject); } } diff --git a/src/SingletonMediator.php b/src/SingletonMediator.php new file mode 100644 index 0000000..b8e9ac1 --- /dev/null +++ b/src/SingletonMediator.php @@ -0,0 +1,17 @@ +assertSame($instance1, $instance2); - $this->assertEquals($instance1, $instance2); + public function getInstance() { + return new BaseMediator(); } public function testAddAction() { $self = $this; - $hooks = BaseMediator::getInstance(); - $hooks->add_action('test_add_action', function() use ($self) { + $mediator = $this->getInstance(); + $mediator->add_action('test_add_action', function() use ($self) { $self->assertTrue(true); }); - $hooks->run_actions('test_add_action'); + $mediator->run_actions('test_add_action'); } public function testAddActionWithParameters() { $self = $this; - $hooks = BaseMediator::getInstance(); - $hooks->add_action('test_addaction_with_parameters', function($subject) use ($self) { + $mediator = $this->getInstance(); + $mediator->add_action('test_addaction_with_parameters', function($subject) use ($self) { $self->assertEquals('the-parameter', $subject); }); - $hooks->run_actions('test_addaction_with_parameters', 'the-parameter'); + $mediator->run_actions('test_addaction_with_parameters', 'the-parameter'); } - public function testAddActionPriority() { - $hooks = BaseMediator::getInstance(); + $mediator = $this->getInstance(); $state = (object) array('name' => ''); - $hooks->add_action('test_add_action_priority', function($subject) { + $mediator->add_action('test_add_action_priority', function($subject) { $subject->name .= '1'; }, 20); - $hooks->add_action('test_add_action_priority', function($subject) { + $mediator->add_action('test_add_action_priority', function($subject) { $subject->name .= '2'; }, 10); - $hooks->add_action('test_add_action_priority', function($subject) { + $mediator->add_action('test_add_action_priority', function($subject) { $subject->name .= '3'; }, 30); - $hooks->run_actions('test_add_action_priority', $state); + $mediator->run_actions('test_add_action_priority', $state); $this->assertEquals('213', $state->name); } public function testRemoveAction() { - $hooks = BaseMediator::getInstance(); + $mediator = $this->getInstance(); $callback1 = function($subject) { $subject->name .= 'callback1'; }; - $hooks->add_action('test_remove_action', $callback1, 10); + $mediator->add_action('test_remove_action', $callback1, 10); $callback2 = function($subject) { $subject->name .= 'callback2'; }; - $hooks->add_action('test_remove_action', $callback2, 20); + $mediator->add_action('test_remove_action', $callback2, 20); $state = (object) array('name' => ''); - $hooks->run_actions('test_remove_action', $state); + $mediator->run_actions('test_remove_action', $state); $this->assertEquals('callback1callback2', $state->name); $state = (object) array('name' => ''); - $hooks->remove_action('test_remove_action', $callback1); - $hooks->run_actions('test_remove_action', $state); + $mediator->remove_action('test_remove_action', $callback1); + $mediator->run_actions('test_remove_action', $state); $this->assertEquals('callback2', $state->name); } public function testEmptyAction() { - $hooks = BaseMediator::getInstance(); + $mediator = $this->getInstance(); $callback1 = function($subject) { $subject->name .= 'callback1'; }; - $hooks->add_action('test_empty_action', $callback1, 10); + $mediator->add_action('test_empty_action', $callback1, 10); $callback2 = function($subject) { $subject->name .= 'callback2'; }; - $hooks->add_action('test_empty_action', $callback2, 20); + $mediator->add_action('test_empty_action', $callback2, 20); $state = (object) array('name' => 'untouched'); - $hooks->remove_action('test_empty_action'); - $hooks->run_actions('test_empty_action', $state); + $mediator->remove_action('test_empty_action'); + $mediator->run_actions('test_empty_action', $state); $this->assertEquals('untouched', $state->name); } public function testAddFilter() { - $hooks = BaseMediator::getInstance(); + $mediator = $this->getInstance(); - $hooks->add_filter('test_add_filter', function($subject){ + $mediator->add_filter('test_add_filter', function($subject){ return $subject * 2; }); - $hooks->add_filter('test_add_filter', function($subject){ + $mediator->add_filter('test_add_filter', function($subject){ return $subject * 3; }); - $hooks->add_filter('test_add_filter', function($subject){ + $mediator->add_filter('test_add_filter', function($subject){ return $subject - 6; }); - $result = $hooks->run_filters('test_add_filter', 1); + $result = $mediator->run_filters('test_add_filter', 1); $this->assertEquals(0, $result); } + + public function testRunEmptyFilter() { + $mediator = $this->getInstance(); + $result = $mediator->run_filters('test_run_empty_filter', 'untouched'); + $this->assertEquals('untouched', $result); + } } diff --git a/tests/SingletonMediatorTest.php b/tests/SingletonMediatorTest.php new file mode 100644 index 0000000..84cdac5 --- /dev/null +++ b/tests/SingletonMediatorTest.php @@ -0,0 +1,24 @@ +getInstance(); + $instance2 = $this->getInstance(); + + $instance1->add_filter('test_unique_instance', function($value) { + return "> $value <"; + }); + $result = $instance2->run_filters('test_unique_instance', 'foo'); + + $this->assertSame($instance1, $instance2); + $this->assertEquals("> foo <", $result); + } +}