Skip to content
This repository has been archived by the owner on Dec 17, 2021. It is now read-only.

Commit

Permalink
Separate singleton class from normal class
Browse files Browse the repository at this point in the history
  • Loading branch information
fabiomontefuscolo committed May 15, 2018
1 parent b2bd946 commit d44d11d
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 78 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down
49 changes: 7 additions & 42 deletions src/BaseMediator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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 ])) {
Expand Down Expand Up @@ -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);

Expand All @@ -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) {
Expand All @@ -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);
}
}
17 changes: 17 additions & 0 deletions src/SingletonMediator.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
<?php
namespace montefuscolo;

class SingletonMediator extends BaseMediator {
private static $instance = null;

private function __construct() {
parent::__construct();
}

public static function getInstance() {
if (self::$instance === null) {
self::$instance = new self();
}
return self::$instance;
}
}
70 changes: 35 additions & 35 deletions tests/BaseMediatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,106 +5,106 @@


class BaseMediatorTest extends TestCase {

public function testUniqueInstance() {
$instance1 = BaseMediator::getInstance();
$instance2 = BaseMediator::getInstance();

$this->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);
}
}
24 changes: 24 additions & 0 deletions tests/SingletonMediatorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

use PHPUnit\Framework\TestCase;
use montefuscolo\SingletonMediator;


class SingletonMediatorTest extends BaseMediatorTest {
public function getInstance() {
return SingletonMediator::getInstance();
}

public function testUniqueInstance() {
$instance1 = $this->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);
}
}

0 comments on commit d44d11d

Please sign in to comment.