'Run through and process all the callbacks for the specified keys.
Caller should be specified at all times so that callbacks which
require a specific function to call CallbackManager.process will
not be processed.
: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 object caller: Who is firing the event
:param list args: Any optional arguments
:param dict keywords: Optional keyword arguments
:rtype: bool'

@sanitize_prefix
@check_for_prefix_and_key
def process(self, prefix, key, caller, *args, **keywords):

    LOGGER.debug('Processing    %s:%s', prefix, key)
    if ((prefix not in self._stack) or (key not in self._stack[prefix])):
        return False
    callbacks = list()
    for callback_dict in list(self._stack[prefix][key]):
        if self._should_process_callback(callback_dict, caller, list(args)):
            callbacks.append(callback_dict[self.CALLBACK])
            if callback_dict[self.ONE_SHOT]:
                self._use_one_shot_callback(prefix, key, callback_dict)
    for callback in callbacks:
        LOGGER.debug('Calling    %s    for    "%s:%s"', callback, prefix, key)
        try:
            callback(*args, **keywords)
        except:
            LOGGER.exception('Calling    %s    for    "%s:%s"    failed', callback, prefix, key)
            raise
    return True
