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