" % (self.obj, self.weight)
**** CubicPower OpenStack Study ****
class BaseWeigher(object):
    """Base class for pluggable weighers."""
    
**** CubicPower OpenStack Study ****
    def _weight_multiplier(self):
        """How weighted this weigher should be.  Normally this would
        be overridden in a subclass based on a config value.
        """
        return 1.0
**** CubicPower OpenStack Study ****
    def _weigh_object(self, obj, weight_properties):
        """Override in a subclass to specify a weight for a specific
        object.
        """
        return 0.0
**** CubicPower OpenStack Study ****
    def weigh_objects(self, weighed_obj_list, weight_properties):
        """Weigh multiple objects.  Override in a subclass if you need
        need access to all objects in order to manipulate weights.
        """
        constant = self._weight_multiplier()
        for obj in weighed_obj_list:
            obj.weight += (constant *
                           self._weigh_object(obj.obj, weight_properties))
**** CubicPower OpenStack Study ****
class BaseWeightHandler(base_handler.BaseHandler):
    object_class = WeighedObject
    
**** CubicPower OpenStack Study ****
    def get_weighed_objects(self, weigher_classes, obj_list,
                            weighing_properties):
        """Return a sorted (highest score first) list of WeighedObjects."""
        if not obj_list:
            return []
        weighed_objs = [self.object_class(obj, 0.0) for obj in obj_list]
        for weigher_cls in weigher_classes:
            weigher = weigher_cls()
            weigher.weigh_objects(weighed_objs, weighing_properties)
        return sorted(weighed_objs, key=lambda x: x.weight, reverse=True)