class Dispatcher(object):
    namespace = "dispatcher"

    def __init__(self, namespace=None):
        self._registry_ = {}
        if namespace:
            self.namespace = namespace

    def register_for(self, target):
        def wrap(dispatch_class):
            self._registry_[target] = dispatch_class
            return dispatch_class
        return wrap

    def get_for(self, obj):
        targets = type(obj).__mro__
        for target in targets:
            if target in self._registry_:
                return self._registry_[target](obj)
        else:
            raise ValueError(
                "no %s found for object: %s" % (self.namespace, obj))


class Cursor(object):
    def __init__(self, connection):
        self.connection = connection
        self.cursor = connection.cursor()
        self.release()

    def lock(self):
        self.available = False

    def release(self):
        self.available = True
