docs: def collect(self, force=False):
          """
          calls collect_impl and stores the results as the child changes of
          this super-change. Returns a tuple of the data generated from
          collect_impl. Caches the result rather than re-computing each
          time, unless force is True
          """
  
          if force or not self.changes:
              self.changes = tuple(self.collect_impl())
          return self.changes