code: def exec_iteration(self, counter, context, step_method):
          
          logger.debug("starting")
          context['whileCounter'] = counter
  
          logger.info(f"while: running step with counter {counter}")
          step_method(context)
          logger.debug(f"while: done step {counter}")
  
          result = False
          # if no stop, just iterating to max)
          if self.stop:
              # dynamically evaluate stop after step execution, since the step
              # might have changed True/False status for stop.
              result = context.get_formatted_as_type(self.stop, out_type=bool)
  
          logger.debug("done")
          return result
docs: Run a single loop iteration.
  
          This method abides by the signature invoked by poll.while_until_true,
          which is to say (counter, *args, **kwargs). In a normal execution
          chain, this method's args passed by self.while_loop where context
          and step_method set. while_until_true injects counter as a 1st arg.
  
          Args:
              counter. int. loop counter, which number of iteration is this.
              context: (pypyr.context.Context) The pypyr context. This arg will
                       mutate - after method execution will contain the new
                       updated context.
              step_method: (method/function) This is the method/function that
                           will execute on every loop iteration. Signature is:
                           function(context)
  
           Returns:
              bool. True if self.stop evaluates to True after step execution,
                    False otherwise.