Deletes a pipe (A, ..., N) which is an N-``tuple`` of ``Piper`` 
        instances. Deleting a pipe means to delete all the connections between 
        ``Pipers`` and to delete all the ``Pipers``. If "forced" is ``False`` 
        only ``Pipers`` which are not used anymore (i.e. have not downstream 
        ``Pipers``) are deleted.

        The direction of the edges in the ``DictGraph`` is reversed compared to 
        the left to right data-flow in a pipe.

        Arguments:

          - pipe(sequence) N-``tuple`` of ``Piper`` instances or objects which 
            can be resolved in the ``Dagger`` (see: ``Dagger.resolve``). The 
            ``Pipers`` are removed in the order from right to left.
            
          - forced(``bool``) [default: ``False``] The forced argument will be 
            given to the ``Dagger.del_piper`` method. If "forced" is ``False`` 
            only ``Pipers`` with no outgoing pipes will be deleted.

def del_pipe(self, pipe, forced=False):
        """
        Deletes a pipe (A, ..., N) which is an N-``tuple`` of ``Piper`` 
        instances. Deleting a pipe means to delete all the connections between 
        ``Pipers`` and to delete all the ``Pipers``. If "forced" is ``False`` 
        only ``Pipers`` which are not used anymore (i.e. have not downstream 
        ``Pipers``) are deleted.

        The direction of the edges in the ``DictGraph`` is reversed compared to 
        the left to right data-flow in a pipe.

        Arguments:

          - pipe(sequence) N-``tuple`` of ``Piper`` instances or objects which 
            can be resolved in the ``Dagger`` (see: ``Dagger.resolve``). The 
            ``Pipers`` are removed in the order from right to left.
            
          - forced(``bool``) [default: ``False``] The forced argument will be 
            given to the ``Dagger.del_piper`` method. If "forced" is ``False`` 
            only ``Pipers`` with no outgoing pipes will be deleted.

        """
        self.log.debug('%s removes pipe%s forced: %s' % \
                      (repr(self), repr(pipe), forced))
        pipe = list(reversed(pipe))
        for i in xrange(len(pipe) - 1):
            edge = (self.resolve(pipe[i]), self.resolve(pipe[i + 1]))
            self.del_edge(edge)
            self.log.debug('%s removed the %s>>>%s edge' % \
                          (repr(self), edge[0], edge[1]))
            try:
                self.del_piper(edge[0], forced)
                self.del_piper(edge[1], forced)
            except DaggerError:
                pass