TODO: describe.
        TODO: For multi-dimensional case, might need extra work here if the reduction is being
        performed only along a certain axis.
        We force evaluation at the end of the reduction - weird errors if we don't. This seems
        safer anyway.
        np supports reduce only for binary ops.

def _handle_reduce(self, ufunc, input_args, outputs):
        '''
        TODO: describe.
        TODO: For multi-dimensional case, might need extra work here if the reduction is being
        performed only along a certain axis.
        We force evaluation at the end of the reduction - weird errors if we don't. This seems
        safer anyway.
        np supports reduce only for binary ops.
        '''
        # input_args[0] must be self so it can be ignored.
        assert len(input_args) == 1
        if outputs: output = outputs[0]
        else: output = None
        if ufunc.__name__ in BINARY_OPS:
            return self._reduce_op(BINARY_OPS[ufunc.__name__], result=output)