'Perform execution with a state.
You should only override this method in a subclass in order to provide the correct method signature and
docstring. You should override the ``_process`` method to do your actual execution.
:param state:       The state with which to execute. This state will be copied before
modification.
:param inline:      This is an inline execution. Do not bother copying the state.
:param force_addr:  Force execution to pretend that we\'re working at this concrete address
:returns:           A SimSuccessors object categorizing the execution\'s successor states'

def process(self, state, *args, **kwargs):

    inline = kwargs.pop('inline', False)
    force_addr = kwargs.pop('force_addr', None)
    addr = (state.se.any_int(state._ip) if (force_addr is None) else force_addr)
    if ((not inline) and (o.COW_STATES in state.options)):
        new_state = state.copy()
    else:
        new_state = state
    old_state = state
    del state
    new_state.register_plugin('history', old_state.history.make_child())
    new_state.history.recent_bbl_addrs.append(addr)
    successors = SimSuccessors(addr, new_state)
    new_state._inspect('engine_process', when=BP_BEFORE, sim_engine=self, sim_successors=successors)
    successors = new_state._inspect_getattr('sim_successors', successors)
    self._process(new_state, successors, *args, **kwargs)
    new_state._inspect('engine_process', when=BP_AFTER, sim_successors=successors)
    successors = new_state._inspect_getattr('sim_successors', successors)
    new_state.inspect.downsize()
    return successors
