docs: def exporter(name, extensions=None, sniff=None):
      '''
      @exporter(name) is a decorator that declares that the following function is an file saveing
        function that should be registered with the neuropythy save function. See also the
        forget_exporter function.
  
      Any exporter function must take, as its first argument, a filename and, as its second argument,
      the object to be exported; after that it may take any number of keyword arguments, but no other
      non-keyword arguments. These keyword arguments can be passed to the neuropythy save function.
      
      The following options are accepted:
        * extensions (default: None) may be a string or a collection of strings that indicate possible
          file extensions for files of this type.
        * sniff (default: None) may optionally be a function f(s, d) that yields True when the given
          string s is a filename for a file of this type and/or the given object d is an object that
          can be exported as this type. If no sniff is given, this type can still be detected by
          running all exporters exhaustively and catching any raised exceptions; though this may
          result in partial files written to disk, so is not used by save.
      '''
      name = name.lower()
      if name in exporters:
          raise ValueError('An exporter for type %s already exists; use forget_exporter' % name)
      extensions = (extensions,) if pimms.is_str(extensions) else \
                   ()            if extensions is None       else \
                   tuple(extensions)
      def _exporter(f):
          global exporters
          exporters = exporters.set(name, (f, extensions, sniff))
          setattr(save, name, f)
          return f
      return _exporter