docs: def prepare_prop_defs(prop_defs, prop_name, cls_names):
      """
      Examines and adds any missing defs to the prop_defs dictionary for
      use with the RdfPropertyMeta.__prepare__ method
  
      Args:
      -----
          prop_defs: the defintions from the rdf vocabulary defintion
          prop_name: the property name
          cls_names: the name of the associated classes
  
      Returns:
      --------
          prop_defs
      """
      def get_def(prop_defs, def_fields, default_val=None):
          """ returns the cross corelated fields for delealing with mutiple
              vocabularies
  
          args:
              prop_defs: the propertry definition object
              def_fields: list of the mapped field names
              default_val: Default value if none of the fields are found
          """
          rtn_list = []
          for fld in def_fields:
              if prop_defs.get(fld):
                  rtn_list += prop_defs.get(fld)
          if not rtn_list and default_val:
              rtn_list.append(default_val)
          elif rtn_list:
              try:
                  rtn_list = list(set(rtn_list))
              except TypeError as e:
                  # This deals with a domain that required a conjunction of two
                  # rdf_Classes
                  # pdb.set_trace()
                  new_rtn = []
                  for item in rtn_list:
                      if isinstance(item, MODULE.rdfclass.RdfClassBase):
                          new_rtn.append(\
                                  "|".join(merge_rdf_list(item['owl_unionOf'])))
                      elif isinstance(item, list):
                          new_rtn.append("|".join(item))
                      else:
                          new_rtn.append(item)
                  rtn_list = list(set(new_rtn))
                  new_rtn = []
                  for item in rtn_list:
                      if "|" in item:
                          new_rtn.append([Uri(domain) \
                                          for domain in item.split("|")])
                      else:
                          new_rtn.append(Uri(item))
                  rtn_list = new_rtn
  
                  # pdb.set_trace()
          return rtn_list
  
      required_def_defaults = {
          Uri('kds_rangeDef'): [{}],
          Uri('rdfs_range'): [Uri("xsd_string")],
          Uri('rdfs_domain'): cls_names,
          Uri('rdfs_label'): [NSM.nouri(prop_name)],
          Uri('kds_formDefault'): [{
              Uri('kds:appliesToClass'): Uri('kdr:AllClasses'),
              Uri('kds:formFieldName'): "emailaddr",
              Uri('kds:formLabelName'): [NSM.nouri(prop_name)],
              Uri('kds:formFieldHelp'): find_values(DESCRIPTION_FIELDS,
                                                    prop_defs,
                                                    None),
              Uri('kds:fieldType'): {
                  Uri('rdf:type'): Uri('kdr:TextField')
              }
          }],
          Uri('kds_propertyValidation'): [],
          Uri('kds_propertySecurity'): [],
          Uri('kds_propertyProcessing'): []
      }
      for prop in required_def_defaults:
          if prop not in prop_defs.keys():
              prop_defs[prop] = required_def_defaults[prop]
      prop_defs['rdfs_domain'] = get_def(prop_defs, DOMAIN_FIELDS, cls_names)
      prop_defs['rdfs_range'] = get_def(prop_defs, RANGE_FIELDS,
                                        Uri('xsd_string'))
  
      return prop_defs