docs: def _dowork(self, dir1, dir2, copyfunc=None, updatefunc=None):
          """ Private attribute for doing work """
  
          if self._verbose:
              self.log('Source directory: %s:' % dir1)
  
          self._dcmp = self._compare(dir1, dir2)
  
          # Files & directories only in target directory
          if self._purge:
              for f2 in self._dcmp.right_only:
                  fullf2 = os.path.join(self._dir2, f2)
                  if self._verbose:
                      self.log('Deleting %s' % fullf2)
                  try:
                      if os.path.isfile(fullf2):
                          try:
                              os.remove(fullf2)
                              self._deleted.append(fullf2)
                              self._numdelfiles += 1
                          except OSError as e:
                              self.log(str(e))
                              self._numdelffld += 1
                      elif os.path.isdir(fullf2):
                          try:
                              shutil.rmtree(fullf2, True)
                              self._deleted.append(fullf2)
                              self._numdeldirs += 1
                          except shutil.Error as e:
                              self.log(str(e))
                              self._numdeldfld += 1
  
                  except Exception as e:  # of any use ?
                      self.log(str(e))
                      continue
  
          # Files & directories only in source directory
          for f1 in self._dcmp.left_only:
              try:
                  st = os.stat(os.path.join(self._dir1, f1))
              except os.error:
                  continue
  
              if stat.S_ISREG(st.st_mode):
                  if copyfunc:
                      copyfunc(f1, self._dir1, self._dir2)
                      self._added.append(os.path.join(self._dir2, f1))
              elif stat.S_ISDIR(st.st_mode):
                  to_make = os.path.join(self._dir2, f1)
                  if not os.path.exists(to_make):
                      os.makedirs(to_make)
                      self._numnewdirs += 1
                      self._added.append(to_make)
  
          # common files/directories
          for f1 in self._dcmp.common:
              try:
                  st = os.stat(os.path.join(self._dir1, f1))
              except os.error:
                  continue
  
              if stat.S_ISREG(st.st_mode):
                  if updatefunc:
                      updatefunc(f1, self._dir1, self._dir2)