code: def next(self):
          
          if not self._cache:
              self._cache = self._get_results()
              self._retrieved += len(self._cache)
  
          # If we don't have any other data to return, we just
          # stop the iteration.
          if not self._cache:
              raise StopIteration()
  
          # Consuming the cache and updating the "cursor"
          return self._cache.pop(0)
docs: Provide iteration capabilities
  
          Use a small object cache for performance