@staticmethod
def inherited_classinfos(bases):
    """Looks at all classinfos dictionary of bases class and merge them to
        create the initial classinfos dictionary

        Parameters
        ----------
        bases : `list`
            All the bases of the class

        Returns
        -------
        The initial classinfos dictionary

        Notes
        -----
        index corresponds to the distance in terms of inheritance.
        The highest index (in terms of inheritance) at
        which this class has been seen. We take the highest in
        case of multiple inheritance. If we have the following :
                   A0
                  /                  A1 B1
                 |  |
                 A2 |
                  \\/
                  A3
        We want index of A0 to be higher than index of A1 which
        inherits from A0.
        In this example:
            * A3 has index 0
            * A2 and B1 have index 1
            * A1 has index 2
            * A0 has index 3 (even if it could be 2 through B1)
        """
    classinfos = {}
    for base in bases:
        if hasattr(base, '_classinfos'):
            for cls_key in base._classinfos:
                base_infos = base._classinfos[cls_key]
                if cls_key in classinfos:
                    current_info = classinfos[cls_key]
                    current_info['index'] = max(current_info['index'], 
                        base_infos['index'] + 1)
                else:
                    classinfos[cls_key] = {}
                    classinfos[cls_key]['index'] = base_infos['index'] + 1
                    classinfos[cls_key]['attr'] = base_infos['attr']
    return classinfos
