Update our providers from either an ICatalog subclass/instance or a mapping.

        If arg is an ICatalog, we update from it's ._providers attribute.

        :param arg: Di/Catalog/Mapping to update from.
        :type arg: ICatalog or collections.Mapping
        :param allow_overwrite: If True, allow overwriting existing keys
        :type allow_overwrite: bool

def update(self, arg, allow_overwrite=False):
        """
        Update our providers from either an ICatalog subclass/instance or a mapping.

        If arg is an ICatalog, we update from it's ._providers attribute.

        :param arg: Di/Catalog/Mapping to update from.
        :type arg: ICatalog or collections.Mapping
        :param allow_overwrite: If True, allow overwriting existing keys
        :type allow_overwrite: bool
        """
        # If arg happens to be an ICatalog subclass
        if inspect.isclass(arg) and issubclass(arg, ICatalog) or isinstance(arg, ICatalog):
            arg = arg._providers
        if not allow_overwrite:
            for key in arg:
                if key in self._providers:
                    raise KeyError("Key %s already exists" % key)
        super(ProviderMapping, self).update(arg)