docs: def run_dot(self, args, name, parts=0, urls={},
                  graph_options={}, node_options={}, edge_options={}):
          """
          Run graphviz 'dot' over this graph, returning whatever 'dot'
          writes to stdout.
  
          *args* will be passed along as commandline arguments.
  
          *name* is the name of the graph
  
          *urls* is a dictionary mapping class names to http urls
  
          Raises DotException for any of the many os and
          installation-related errors that may occur.
          """
          try:
              dot = subprocess.Popen(['dot'] + list(args),
                                     stdin=subprocess.PIPE, stdout=subprocess.PIPE,
                                     close_fds=True)
          except OSError:
              raise DotException("Could not execute 'dot'.  Are you sure you have 'graphviz' installed?")
          except ValueError:
              raise DotException("'dot' called with invalid arguments")
          except:
              raise DotException("Unexpected error calling 'dot'")
  
          self.generate_dot(dot.stdin, name, parts, urls, graph_options,
                            node_options, edge_options)
          dot.stdin.close()
          result = dot.stdout.read()
          returncode = dot.wait()
          if returncode != 0:
              raise DotException("'dot' returned the errorcode %d" % returncode)
          return result