Skip to content

Commit 099ee40

Browse files
committed
Merge branch 'feature/listeners-priority' into develop
2 parents 3584ecd + 8743ff8 commit 099ee40

File tree

1 file changed

+38
-8
lines changed

1 file changed

+38
-8
lines changed

lib/Bitbucket/API/Http/Client.php

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,14 @@ public function __construct(array $options = array(), BuzzClientInterface $clien
7070
/**
7171
* {@inheritDoc}
7272
*/
73-
public function addListener(ListenerInterface $listener)
73+
public function addListener(ListenerInterface $listener, $priority = 0)
7474
{
75-
$this->listeners[$listener->getName()] = $listener;
75+
// Don't allow same listener with different priorities.
76+
if ($this->isListener($listener->getName())) {
77+
$this->delListener($listener->getName());
78+
}
79+
80+
$this->listeners[$priority][$listener->getName()] = $listener;
7681

7782
return $this;
7883
}
@@ -87,7 +92,9 @@ public function delListener($name)
8792
}
8893

8994
if ($this->isListener($name) === true) {
90-
unset($this->listeners[$name]);
95+
foreach ($this->listeners as $collection) {
96+
unset($collection[$name]);
97+
}
9198
}
9299

93100
return $this;
@@ -98,19 +105,19 @@ public function delListener($name)
98105
*/
99106
public function getListener($name)
100107
{
101-
if (!$this->isListener($name)) {
108+
if (!$listener = $this->searchListener($name)) {
102109
throw new \InvalidArgumentException(sprintf('Unknown listener %s', $name));
103110
}
104111

105-
return $this->listeners[$name];
112+
return $listener;
106113
}
107114

108115
/**
109116
* {@inheritDoc}
110117
*/
111118
public function isListener($name)
112119
{
113-
return isset($this->listeners[$name]);
120+
return ($this->searchListener($name) instanceof ListenerInterface);
114121
}
115122

116123
/**
@@ -322,8 +329,31 @@ protected function executeListeners(RequestInterface $request, $when = 'preSend'
322329
$params[] = $response;
323330
}
324331

325-
foreach ($this->listeners as $listener) {
326-
call_user_func_array(array($listener, $when), $params);
332+
ksort($this->listeners, SORT_ASC);
333+
334+
array_walk_recursive(
335+
$this->listeners,
336+
function ($class) use ($when, $params) {
337+
if ($class instanceof ListenerInterface) {
338+
call_user_func_array(array($class, $when), $params);
339+
}
340+
}
341+
);
342+
}
343+
344+
/**
345+
* @access protected
346+
* @param string $name Listener name
347+
* @return ListenerInterface|bool false on error
348+
*/
349+
protected function searchListener($name)
350+
{
351+
foreach ($this->listeners as $collection) {
352+
if (isset($collection[$name])) {
353+
return $collection[$name];
354+
}
327355
}
356+
357+
return false;
328358
}
329359
}

0 commit comments

Comments
 (0)