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 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