docs: def _AtNonLeaf(self, attr_value, path):
      """Called when at a non-leaf value. Should recurse and yield values."""
      try:
        if isinstance(attr_value, collections.Mapping):
          # If it's dictionary-like, treat the dict key as the attribute..
          sub_obj = attr_value.get(path[1])
          if len(path) > 2:
            # Expand any additional elements underneath the key.
            sub_obj = self.Expand(sub_obj, path[2:])
          if isinstance(sub_obj, string_types):
            # If it is a string, stop here
            yield sub_obj
          elif isinstance(sub_obj, collections.Mapping):
            # If the result is a dict, return each key/value pair as a new dict.
            for k, v in iteritems(sub_obj):
              yield {k: v}
          else:
            for value in sub_obj:
              yield value
        else:
          # If it's an iterable, we recurse on each value.
          for sub_obj in attr_value:
            for value in self.Expand(sub_obj, path[1:]):
              yield value
      except TypeError:  # This is then not iterable, we recurse with the value
        for value in self.Expand(attr_value, path[1:]):
          yield value