code: def save(self, path=None, debug=False):
          
  
          p = self.copy()
          plugin = p._plugin
  
          # require path
          p.path = path or self.path
          if not p.path:
              raise ValueError, "path is required"
  
          if isinstance(p.path, basestring):
              # split path
              (folder, filename) = os.path.split(p.path)
              (name, extension) = os.path.splitext(filename)
  
              # get plugin from extension
              if path: # only if not using self.path
                  try:
                      plugin = kurt.plugin.Kurt.get_plugin(extension=extension)
                  except ValueError:
                      pass
  
              # build output path
              if not name:
                  name = _clean_filename(self.name)
                  if not name:
                      raise ValueError, "name is required"
              filename = name + plugin.extension
              p.path = os.path.join(folder, filename)
  
              # open
              fp = open(p.path, "wb")
          else:
              fp = p.path
              path = None
  
          if not plugin:
              raise ValueError, "must convert project to a format before saving"
  
          for m in p.convert(plugin):
              print m
          result = p._save(fp)
          if path:
              fp.close()
          return result if debug else p.path
docs: Save project to file.
  
          :param path: Path or file pointer.
  
                       If you pass a file pointer, you're responsible for closing
                       it.
  
                       If path is not given, the :attr:`path` attribute is used,
                       usually the original path given to :attr:`load()`.
  
                       If `path` has the extension of an existing plugin, the
                       project will be converted using :attr:`convert`.
                       Otherwise, the extension will be replaced with the
                       extension of the current plugin.
  
                       (Note that log output for the conversion will be printed
                       to stdout. If you want to deal with the output, call
                       :attr:`convert` directly.)
  
                       If the path ends in a folder instead of a file, the
                       filename is based on the project's :attr:`name`.
  
          :param debug: If true, return debugging information from the format
                        plugin instead of the path.
  
          :raises: :py:class:`ValueError` if there's no path or name.
  
          :returns: path to the saved file.