docs: def _get_recursive_iterator(self, recursive=False):
          """
          Basic recursive iterator whose only purpose is to yield all items
          and sections in order, with their full paths as keys.
  
          Main challenge is to de-duplicate items and sections which
          have aliases.
  
          Do not add any new features to this iterator, instead
          build others that extend this one.
          """
  
          names_yielded = set()
  
          for obj_alias, obj in self._tree.items():
              if obj.is_section:
                  if obj.alias in names_yielded:
                      continue
                  names_yielded.add(obj.alias)
  
                  yield (obj.alias,), obj
  
                  if not recursive:
                      continue
  
                  for sub_item_path, sub_item in obj._get_recursive_iterator(recursive=recursive):
                      yield (obj_alias,) + sub_item_path, sub_item
  
              else:
                  # _tree contains duplicates so that we can have multiple aliases point
                  # to the same item. We have to de-duplicate here.
                  if obj.name in names_yielded:
                      continue
                  names_yielded.add(obj.name)
  
                  yield (obj.name,), obj