'Evaluate self(expr) under the given assumptions.
This uses only direct resolution methods, not logical inference.'

def eval(self, expr, assumptions=True):

    (res, _res) = (None, None)
    mro = inspect.getmro(type(expr))
    for handler in self.handlers:
        cls = get_class(handler)
        for subclass in mro:
            try:
                eval = getattr(cls, subclass.__name__)
            except AttributeError:
                continue
            res = eval(expr, assumptions)
            if (res is None):
                continue
            if (_res is None):
                _res = res
            elif (res is None):
                res = _res
            elif (_res != res):
                raise ValueError('incompatible    resolutors')
            break
    return res
