docs: def _str_iterator(self, iterator, name_callback=None, prefix="\n", left_paren='[', right_paren=']', depth=0):
          '''
          turn an iteratable value into a string representation
  
          iterator -- iterator -- the value to be iterated through
          name_callback -- callback -- if not None, a function that will take the key of each iteration
          prefix -- string -- what will be prepended to the generated value
          left_paren -- string -- what will open the generated value
          right_paren -- string -- what will close the generated value
          depth -- integer -- how deep into recursion we are
  
          return -- string
          '''
          indent = 1 if depth > 0 else 0
  
          s = []
          s.append('{}{}'.format(prefix, self._add_indent(left_paren, indent)))
  
          s_body = []
  
          for k, v in iterator:
              k = k if name_callback is None else name_callback(k)
              v = Value(v, depth+1)
              try:
                  # TODO -- right here we should check some flag or something to
                  # see if lists should render objects
                  if k is None:
                      s_body.append("{}".format(v))
                  else:
                      s_body.append("{}: {}".format(k, v))
  
              except RuntimeError as e:
                  # I've never gotten this to work
                  s_body.append("{}: ... Recursion error ...".format(k))
  
              except UnicodeError as e:
                  print(v.val)
                  print(type(v.val))
  
          s_body = ",\n".join(s_body)
          s_body = self._add_indent(s_body, indent + 1)
  
          s.append(s_body)
          s.append("{}".format(self._add_indent(right_paren, indent)))
  
          return "\n".join(s)