Generates a property class from the defintion dictionary

    args:
        prop_defs: the dictionary defining the property
        prop_name: the base name of the property
        cls_name: the name of the rdf_class with which the property is
                  associated

def make_property(prop_defs, prop_name, cls_names=[], hierarchy=[]):
    """ Generates a property class from the defintion dictionary

    args:
        prop_defs: the dictionary defining the property
        prop_name: the base name of the property
        cls_name: the name of the rdf_class with which the property is
                  associated
    """
    register = False
    try:
        cls_names.remove('RdfClassBase')
    except ValueError:
        pass
    if cls_names:
        new_name = "%s_%s" % (prop_name.pyuri, "_".join(cls_names))
        prop_defs['kds_appliesToClass'] = cls_names
    elif not cls_names:
        cls_names = [Uri('kdr_AllClasses')]
        register = True
        new_name = prop_name
    else:
        new_name = prop_name

    new_prop = types.new_class(new_name,
                               (RdfPropertyBase, list,),
                               {'metaclass': RdfPropertyMeta,
                                'prop_defs': prop_defs,
                                'class_names': cls_names,
                                'prop_name': prop_name,
                                'hierarchy': hierarchy})
    if register:
        global properties
        global domain_props
        properties[new_name] = new_prop
        for domain in new_prop.rdfs_domain:
            try:
                # domain_props[domain].append(new_prop)
                domain_props[domain][prop_name] = prop_defs
            except KeyError:
                # domain_props[domain] = [new_prop]
                domain_props[domain] = {}
                domain_props[domain][prop_name] = prop_defs
            except TypeError:
                pass
    return new_prop