|
@@ -155,6 +155,7 @@ class EventDispatcher
|
|
$return = 0;
|
|
$return = 0;
|
|
foreach ($listeners as $callable) {
|
|
foreach ($listeners as $callable) {
|
|
if (!is_string($callable) && is_callable($callable)) {
|
|
if (!is_string($callable) && is_callable($callable)) {
|
|
|
|
+ $event = $this->checkListenerExpectedEvent($callable, $event);
|
|
$return = false === call_user_func($callable, $event) ? 1 : 0;
|
|
$return = false === call_user_func($callable, $event) ? 1 : 0;
|
|
} elseif ($this->isPhpScript($callable)) {
|
|
} elseif ($this->isPhpScript($callable)) {
|
|
$className = substr($callable, 0, strpos($callable, '::'));
|
|
$className = substr($callable, 0, strpos($callable, '::'));
|
|
@@ -200,9 +201,37 @@ class EventDispatcher
|
|
*/
|
|
*/
|
|
protected function executeEventPhpScript($className, $methodName, Event $event)
|
|
protected function executeEventPhpScript($className, $methodName, Event $event)
|
|
{
|
|
{
|
|
|
|
+ $event = $this->checkListenerExpectedEvent(array($className, $methodName), $event);
|
|
|
|
+
|
|
return $className::$methodName($event);
|
|
return $className::$methodName($event);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * @param mixed $target
|
|
|
|
+ * @param Event $event
|
|
|
|
+ * @return Event|CommandEvent
|
|
|
|
+ */
|
|
|
|
+ protected function checkListenerExpectedEvent($target, Event $event)
|
|
|
|
+ {
|
|
|
|
+ if (!$event instanceof Script\Event) {
|
|
|
|
+ return $event;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ try {
|
|
|
|
+ $reflected = new \ReflectionParameter($target, 0);
|
|
|
|
+ } catch (\ReflectionException $e) {
|
|
|
|
+ return $event;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $expected = $reflected->getClass()->name;
|
|
|
|
+
|
|
|
|
+ if (!$event instanceof $expected && $expected === 'Composer\Script\CommandEvent') {
|
|
|
|
+ $event = new CommandEvent($event->getName(), $event->getComposer(), $event->getIO(), $event->isDevMode(), $event->getArguments());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $event;
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Add a listener for a particular event
|
|
* Add a listener for a particular event
|
|
*
|
|
*
|