'Add a callback to the stack for the specified key. If the call is
specified as one_shot, it will be removed after being fired
The prefix is usually the channel number but the class is generic
and prefix and key may be any value. If you pass in only_caller
CallbackManager will restrict processing of the callback to only
the calling function/object that you specify.
:param prefix: Categorize the callback
:type prefix: str or int
:param key: The key for the callback
:type key: object or str or dict
:param method callback: The callback to call
:param bool one_shot: Remove this callback after it is called
:param object only_caller: Only allow one_caller value to call the
event that fires the callback.
:param dict arguments: Arguments to validate when processing
:rtype: tuple(prefix, key)'

@sanitize_prefix
def add(self, prefix, key, callback, one_shot=True, only_caller=None, arguments=None):

    if (prefix not in self._stack):
        self._stack[prefix] = dict()
    if (key not in self._stack[prefix]):
        self._stack[prefix][key] = list()
    for callback_dict in self._stack[prefix][key]:
        if ((callback_dict[self.CALLBACK] == callback) and (callback_dict[self.ARGUMENTS] == arguments) and (callback_dict[self.ONLY_CALLER] == only_caller)):
            if (callback_dict[self.ONE_SHOT] is True):
                callback_dict[self.CALLS] += 1
                LOGGER.debug('Incremented    callback    reference    counter:    %r', callback_dict)
            else:
                LOGGER.warning(self.DUPLICATE_WARNING, prefix, key)
            return (prefix, key)
    callback_dict = self._callback_dict(callback, one_shot, only_caller, arguments)
    self._stack[prefix][key].append(callback_dict)
    LOGGER.debug('Added:    %r', callback_dict)
    return (prefix, key)
