docs: def iter_filth(self, text):
          """Iterate over the different types of filth that can exist.
          """
          # currently doing this by aggregating all_filths and then sorting
          # inline instead of with a Filth.__cmp__ method, which is apparently
          # much slower http://stackoverflow.com/a/988728/564709
          #
          # NOTE: we could probably do this in a more efficient way by iterating
          # over all detectors simultaneously. just trying to get something
          # working right now and we can worry about efficiency later
          all_filths = []
          for detector in self._detectors.values():
              for filth in detector.iter_filth(text):
                  if not isinstance(filth, Filth):
                      raise TypeError('iter_filth must always yield Filth')
                  all_filths.append(filth)
  
          # Sort by start position. If two filths start in the same place then
          # return the longer one first
          all_filths.sort(key=lambda f: (f.beg, -f.end))
  
          # this is where the Scrubber does its hard work and merges any
          # overlapping filths.
          if not all_filths:
              raise StopIteration
          filth = all_filths[0]
          for next_filth in all_filths[1:]:
              if filth.end < next_filth.beg:
                  yield filth
                  filth = next_filth
              else:
                  filth = filth.merge(next_filth)
          yield filth