code: def process_value_pairs(self, tokens, type_):
          
          key, body = self.check_composite_tokens(type_, tokens)
          key_name = self.key_name(key)
  
          d = CaseInsensitiveOrderedDict(CaseInsensitiveOrderedDict)
  
          for t in body:
              k = self.clean_string(t[0].value).lower()
              v = self.clean_string(t[1].value)
  
              if k in d.keys():
                  log.warning("A duplicate key ({}) was found in {}. Only the last value ({}) will be used. ".format(
                              k, type_, v))
  
              d[k] = v
  
          if self.include_position:
              pd = self.create_position_dict(key, body)
              d["__position__"] = pd
  
          d["__type__"] = key_name
  
          # return the token as well as the processed dict so the
          # composites function works the same way
          return d
docs: Metadata, Values, and Validation blocks can either
          have string pairs or attributes
          Attributes will already be processed