function trigger($event, $bp = null, $pb = null)
    {
        if ( $this->isShutdown() )
            return $this;


        $Collector = $this->collector();
        
        if ($bp === null)
            ## emit nested event with current collector data
            $bp = $Collector;
        elseif ($bp instanceof iData || is_array($bp))
            /** @var iData $Collector */
            $bp = $Collector->import($bp);

        if (is_string($event) || $event instanceof iEvent)
            $event = array($event);
        else if (!is_array($event))
            throw new \InvalidArgumentException(sprintf(
                'Events must be a string or iEvent instance, or array of these two.'
            ));


        foreach($event as $e)
        {
            $event = $this->byEvent($e);
            $event = clone $event;
            try {
                $event = $event->emit($bp, $pb);
            } catch(\Exception $exception) {
                if ($this->failure) {
                    call_user_func($this->failure, $exception, $this);
                    return $this;
                }

                throw $exception;
            }

            $Collector->import( $event->collector() );
        }

        return $this;
    }