def __add__(self, other):
if not isinstance(other, ExHandle):<EOL><INDENT>stype = str(type(other))<EOL>offset = stype.index("<STR_LIT:'>") + <NUM_LIT:1><EOL>raise TypeError(<EOL>"<STR_LIT>"<EOL>+ stype[offset:-<NUM_LIT:2>]<EOL>)<EOL><DEDENT>if (self._full_cname != other._full_cname) or (self._exclude != other._exclude):<EOL><INDENT>raise RuntimeError("<STR_LIT>")<EOL><DEDENT>robj = ExHandle(full_cname=self._full_cname, exclude=self._exclude, _copy=True)<EOL>ex_dict = copy.deepcopy(other._ex_dict)<EOL>robj._ex_dict = copy.deepcopy(self._ex_dict)<EOL>robj._clut = copy.deepcopy(self._clut)<EOL>_merge_cdicts(robj, other._clut, ex_dict, other._callables_separator)<EOL>_merge_ex_dicts(robj._ex_dict, ex_dict)<EOL>robj._callables_obj = copy.copy(self._callables_obj) + copy.copy(<EOL>other._callables_obj<EOL>)<EOL>return robj<EOL>
Merge two objects.

:raises:
 * RuntimeError (Incompatible exception handlers)

 * TypeError (Unsupported operand type(s) for +:
   pexdoc.ExHandle and *[other_type]*)

For example:

    >>> import copy, pexdoc
    >>> @pexdoc.contract(num=int)
    ... def mynumber(num):
    ...     return num+1
    >>> @pexdoc.contract(char=str)
    ... def mystring(char):
    ...     return 'Hello '+char
    >>> pexdoc.set_exh_obj(pexdoc.ExHandle())
    >>> mynumber(1)
    2
    >>> mystring('Tom')
    'Hello Tom'
    >>> obj1 = copy.copy(pexdoc.get_exh_obj())
    >>> pexdoc.del_exh_obj()
    >>> exhobj = pexdoc.get_or_create_exh_obj()
    >>> mynumber(1)
    2
    >>> obj2 = copy.copy(pexdoc.get_exh_obj())
    >>> pexdoc.del_exh_obj()
    >>> exhobj = pexdoc.get_or_create_exh_obj()
    >>> mystring('Tom')
    'Hello Tom'
    >>> obj3 = copy.copy(pexdoc.get_exh_obj())
    >>> obj1 == obj2
    False
    >>> obj1 == obj3
    False
    >>> obj1 == obj2+obj3
    True