code: def del_piper(self, piper, forced=False):
          
          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))
docs: 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.