docs: def find(self,
               regexp, negate_regexp=False,
               class_pattern=None,
               find_fnc=re.search,
               refresh_cache=False):
          """
          yield the full path of the matching regular expression and the
          match itself
          """
          if refresh_cache or not hasattr(self, 'cache'):
              self._populate_cache()
  
          b = self.cache
          split_regexp = regexp.split('/')
  
          # traverse as deep as possible in the cache
          # special case if the first character is not the root, i.e. not ""
          if split_regexp[0] == '':
              for d in split_regexp:
                  if d in b:
                      b = b[d]
                  else:
                      break
          else:
              b = b['']
  
          # perform the search
          for path, (obj, classname) in b['obj']:
              if class_pattern:
                  if not fnmatch(classname, class_pattern):
                      continue
              joined_path = os.path.join(*['/', path, obj])
              result = find_fnc(regexp, joined_path)
              if (result is not None) ^ negate_regexp:
                  yield joined_path, result