Wrapper for spreadsheet.join, but handles coloring attributes.

        The `selfname` argument allows naming of `self` to be used if `ToMerge` 
        is a dictionary.

        **See also:** :func:`tabular.spreadsheet.join`, :func:`tab_join`

def join(self, ToMerge, keycols=None, nullvals=None, 
             renamer=None, returnrenaming=False, selfname=None, Names=None):
        """
        Wrapper for spreadsheet.join, but handles coloring attributes.

        The `selfname` argument allows naming of `self` to be used if `ToMerge` 
        is a dictionary.

        **See also:** :func:`tabular.spreadsheet.join`, :func:`tab_join`
        """

        if isinstance(ToMerge,np.ndarray):
            ToMerge = [ToMerge]

        if isinstance(ToMerge,dict):
            assert selfname not in ToMerge.keys(), \
             ('Can\'t use "', selfname + '" for name of one of the things to '  
              'merge, since it is the same name as the self object.')
            if selfname == None:
                try:
                    selfname = self.name
                except AttributeError:
                    selfname = 'self'
            ToMerge.update({selfname:self})
        else:
            ToMerge = [self] + ToMerge

        return tab_join(ToMerge, keycols=keycols, nullvals=nullvals, 
                   renamer=renamer, returnrenaming=returnrenaming, Names=Names)