@@ -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