function emit($dataMerge = null, $meeter = null)
    {
        # Prepare given arguments:
        if ($dataMerge instanceof iMeeter) {
            $meeter = $dataMerge;
            $dataMerge = null;
        }

        $Event     = clone $this;
        $Collector = $Event->collector();
        if ($dataMerge !== null)
            ## build collector with default data
            ## we have to keep defaults untouched
            $Collector->import($dataMerge);

        if ($meeter === null)
            $meeter = $this->_getMeeter();


        # Emit listeners:
        $this->_tmp__isEmiting = true;

        $result = null;
        /** @var iListener $listener */
        foreach(clone $this->_listenerQueue() as $listener)
        {
            # propagation stopped by listener
            if ( $Event->isStopPropagation() )
                break;


            $this->_c_lastEmitted = $listener;

            /** @var iMeeter $meeter */
            $meeter = clone $meeter; // reset meter to execute new listener
            $meeter->setEventBelong($Event);

            try {
                $result = $meeter->invokeListener($listener, $Collector);
            } catch(\Exception $e) {
                if ($this->failure)
                    return call_user_func($this->failure, $e, $Event);
                
                throw $e;
            }

            if ($result !== null) {
                if (is_array($result) || $result instanceof \Traversable)
                    ## set result into collector
                    $Collector->import($result);

                // TODO determine result to merge with Collector \
                //      or store in collector with listener name.  
            }
        }

        $this->_tmp__isEmiting = false;
        return $Event;
    }