docs: def extractall(self, directory, auto_create_dir=False, patool_path=None):
          '''
          :param directory: directory to extract to
          :param auto_create_dir: auto create directory
          :param patool_path: the path to the patool backend
          '''
          log.debug('extracting %s into %s (backend=%s)', self.filename, directory, self.backend)
          is_zipfile = zipfile.is_zipfile(self.filename)
          directory = _fullpath(directory)
          if not os.path.exists(self.filename):
              raise ValueError(
                  'archive file does not exist:' + str(self.filename))
          if not os.path.exists(directory):
              if auto_create_dir:
                  os.makedirs(directory)
              else:
                  raise ValueError('directory does not exist:' + str(directory))
  
          if self.backend == 'auto':
              if is_zipfile:
                  self.extractall_zipfile(directory)
              else:
                  self.extractall_patool(directory, patool_path)
  
          if self.backend == 'zipfile':
              if not is_zipfile:
                  raise ValueError('file is not zip file:' + str(self.filename))
              self.extractall_zipfile(directory)
  
          if self.backend == 'patool':
              self.extractall_patool(directory, patool_path)