def handle(data_type, data, data_id=None, caller=None):
if not data_id:<EOL><INDENT>data_id = data_type<EOL><DEDENT>if data_id not in _handlers:<EOL><INDENT>_handlers[data_id] = dict(<EOL>[(h.handle, h) for h in handlers.instantiate_for_data_type(data_type, data_id=data_id)])<EOL><DEDENT>for handler in list(_handlers[data_id].values()):<EOL><INDENT>try:<EOL><INDENT>data = handler(data, caller=caller)<EOL><DEDENT>except Exception as inst:<EOL><INDENT>vodka.log.error("<STR_LIT>" % handler)<EOL>vodka.log.error(traceback.format_exc())<EOL><DEDENT><DEDENT>return data<EOL>
execute all data handlers on the specified data according to data type

Args:
    data_type (str): data type handle
    data (dict or list): data

Kwargs:
    data_id (str): can be used to differentiate between different data
        sets of the same data type. If not specified will default to
        the data type
    caller (object): if specified, holds the object or function that
        is trying to handle data

Returns:
    dict or list - data after handlers have been executed on it