'Return self + other, raising ShapeError if shapes don\'t match.'

@call_highest_priority('__radd__')
def __add__(self, other):

    other = _matrixify(other)
    if hasattr(other, 'shape'):
        if (self.shape != other.shape):
            raise ShapeError(('Matrix    size    mismatch:    %s    +    %s' % (self.shape, other.shape)))
    if getattr(other, 'is_Matrix', False):
        (a, b) = (self, other)
        if (a.__class__ != classof(a, b)):
            (b, a) = (a, b)
        return a._eval_add(b)
    if getattr(other, 'is_MatrixLike', False):
        return MatrixArithmetic._eval_add(self, other)
    raise TypeError(('cannot    add    %s    and    %s' % (type(self), type(other))))
