src/emitter/WildCardEventEmitter.php
<?php
declare(strict_types=1);
namespace stk2k\eventstream\emitter;
use stk2k\eventstream\Event;
use stk2k\eventstream\EventEmitterInterface;
class WildCardEventEmitter extends SimpleEventEmitter implements EventEmitterInterface
{
const PREG_METACHARS = "[]-^+*$\\.?()|!¥a¥b¥c¥d¥h¥n¥q¥w¥z¥n¥t¥0";
/**
* get event regular expression
*
* @param string $event_key
*
* @return string|null
*/
public function getRegExp($event_key)
{
$pos = strpos($event_key,'*');
if ($pos === false){
return null;
}
$buffer = '';
$reg_exp = '';
$length = strlen($event_key);
for($i=0; $i<$length; $i++){
$c = $event_key[$i];
if (strpos(self::PREG_METACHARS,$c) !== false){
if (!empty($buffer)){
$reg_exp .= preg_quote($buffer,'/');
$buffer = '';
}
if ($c == '*'){
$reg_exp .= '.*';
}
else{
$reg_exp .= preg_quote($c,'/');;
}
}
else{
$buffer .= $c;
}
}
if (!empty($buffer)){
$reg_exp .= preg_quote($buffer,'/');
}
return '/^' . $reg_exp . '$/';
}
/**
* {@inheritDoc}
*/
public function emit(Event $event)
{
if (is_array($this->listeners)){
foreach($this->listeners as $event_key => $listers_of_event){
if ($event_key === $event->getName()){
foreach ($listers_of_event as $listener){
call_user_func($listener, $event);
}
}
else {
$reg_exp = $this->getRegExp($event_key);
if ($reg_exp && preg_match($reg_exp,$event->getName())){
foreach ($listers_of_event as $listener){
call_user_func($listener, $event);
}
}
}
}
}
}
}