':param expression: the expression to handle
:param command: the function to apply, either _draw_command or _visit_command
:param x: the top of the current drawing area
:param y: the left side of the current drawing area
:return: the bottom-rightmost point'

def _handle(self, expression, command, x=0, y=0):

    if (command == self._visit_command):
        try:
            right = (expression._drawing_width + x)
            bottom = (expression._drawing_height + y)
            return (right, bottom)
        except AttributeError:
            pass
    if isinstance(expression, DrtAbstractVariableExpression):
        factory = self._handle_VariableExpression
    elif isinstance(expression, DRS):
        factory = self._handle_DRS
    elif isinstance(expression, DrtNegatedExpression):
        factory = self._handle_NegatedExpression
    elif isinstance(expression, DrtLambdaExpression):
        factory = self._handle_LambdaExpression
    elif isinstance(expression, BinaryExpression):
        factory = self._handle_BinaryExpression
    elif isinstance(expression, DrtApplicationExpression):
        factory = self._handle_ApplicationExpression
    elif isinstance(expression, PossibleAntecedents):
        factory = self._handle_VariableExpression
    elif isinstance(expression, DrtProposition):
        factory = self._handle_DrtProposition
    else:
        raise Exception(expression.__class__.__name__)
    (right, bottom) = factory(expression, command, x, y)
    expression._drawing_width = (right - x)
    expression._drawing_height = (bottom - y)
    return (right, bottom)
