def del_piper(self, piper, forced=False):
        """
        Removes a ``Piper`` from the ``Dagger`` instance.

        Arguments:
        
          - piper(``Piper``  or id(``Piper``)) ``Piper`` instance or ``Piper`` 
            instance id.
          - forced(bool) [default: ``False``] If "forced" is ``True``, will not 
            raise a ``DaggerError`` if the ``Piper`` hase outgoing pipes and 
            will also remove it.
            
        """
        self.log.debug('%s trying to delete piper %s' % \
                      (repr(self), repr(piper)))
        try:
            piper = self.resolve(piper, forgive=False)
        except DaggerError:
            self.log.error('%s cannot resolve piper from %s' % \
                           (repr(self), repr(piper)))
            raise DaggerError('%s cannot resolve piper from %s' % \
                              (repr(self), repr(piper)))
        if self.incoming_edges(piper) and not forced:
            self.log.error('%s piper %s has down-stream pipers (use forced =True to override)' % \
                           (repr(self), piper))
            raise DaggerError('%s piper %s has down-stream pipers (use forced =True to override)' % \
                              (repr(self), piper))
        self.del_node(piper)
        self.log.debug('%s deleted piper %s' % (repr(self), piper))
Removes a ``Piper`` from the ``Dagger`` instance.

        Arguments:
        
          - piper(``Piper``  or id(``Piper``)) ``Piper`` instance or ``Piper`` 
            instance id.
          - forced(bool) [default: ``False``] If "forced" is ``True``, will not 
            raise a ``DaggerError`` if the ``Piper`` hase outgoing pipes and 
            will also remove it.