Returns a dictionary containing all the available addons
        for this mixin class.  If the optional recurse flag is set to True,
        then all the base classes will be searched for the given addon as well.
        
        :param      recurse | <bool>
        
        :return     {<str> name: <variant> addon, ..}

def addons(cls, recurse=True):
        """
        Returns a dictionary containing all the available addons
        for this mixin class.  If the optional recurse flag is set to True,
        then all the base classes will be searched for the given addon as well.
        
        :param      recurse | <bool>
        
        :return     {<str> name: <variant> addon, ..}
        """
        cls.initAddons()
        prop = '_{0}__addons'.format(cls.__name__)
        out = {}

        # lookup base classes
        if recurse:
            for base in cls.__bases__:
                if issubclass(base, AddonManager):
                    out.update(base.addons(recurse))

        # always use the highest level for any given key
        out.update(getattr(cls, prop, {}))
        return out