'Remove a callback from the stack by prefix, key and optionally
the callback itself. If you only pass in prefix and key, all
callbacks for that prefix and key will be removed.
:param str or int prefix: The prefix for keeping track of callbacks with
:param str key: The callback key
:param method callback_value: The method defined to call on callback
:param dict arguments: Optional arguments to check
:rtype: bool'

@sanitize_prefix
@check_for_prefix_and_key
def remove(self, prefix, key, callback_value=None, arguments=None):

    if callback_value:
        offsets_to_remove = list()
        for offset in xrange(len(self._stack[prefix][key]), 0, (-1)):
            callback_dict = self._stack[prefix][key][(offset - 1)]
            if ((callback_dict[self.CALLBACK] == callback_value) and self._arguments_match(callback_dict, [arguments])):
                offsets_to_remove.append((offset - 1))
        for offset in offsets_to_remove:
            try:
                LOGGER.debug('Removing    callback    #%i:    %r', offset, self._stack[prefix][key][offset])
                del self._stack[prefix][key][offset]
            except KeyError:
                pass
    self._cleanup_callback_dict(prefix, key)
    return True
