public function trigger(CommandInterface $command, $callback = null)
    {
        if ($callback && !is_callable($callback)) {
            throw new Exception\InvalidCallbackException('Invalid callback provided');
        }
        
        $service = $this->normalizeServiceName($command->getService());
        $responses = new ResponseCollection();
        $command->setResponses($responses);
        
        if (!isset($this->services[$service]) || $this->services[$service]->isEmpty()) {
            return $responses;
        }
        
        $exception = null;
        
        foreach ($this->services[$service] as $listener) {
            
            // Lazy load service as needed
            if (!$listener->getCallback()) {
                $listener->setCallback(
                    $this->getServiceLoader()->load($listener->getMetadatum('service_id')));
            }
            
            try{
                $response  = call_user_func($listener->getCallback(), $command);
                $exception = null;
            } catch(Exception\SkippableException $ex) {
                
                if (!$exception) {
                    $exception = $ex;
                }
                
                if ($command->propagationIsStopped()) {
                    $responses->setStopped(true);
                    break;
                } else {
                    continue;
                }
            }
            
            // Push response into collection
            $responses->push($response);
            
            // If the event was asked to stop propagating, do so
            if ($command->propagationIsStopped()) {
                $responses->setStopped(true);
                break;
            }
            
            // If the result causes our validation callback to return true,
            // stop propagation
            if ($callback && call_user_func($callback, $responses->last())) {
                $responses->setStopped(true);
                break;
            }
        }
        
        if ($exception && $responses->isEmpty()) {
            throw $exception;
        }
        
        return $responses;
    }