def runEventTransaction(self, player, line, match):
        def thunk():
            begin = time.time()
            try:
                actor = self.actorInterface(player)
                for (k, v) in match.items():
                    try:
                        objs = self.resolve(player, k, v)
                    except NotImplementedError:
                        pass
                    else:
                        if len(objs) == 1:
                            match[k] = objs[0]
                        elif len(objs) == 0:
                            self.cantFind(player, actor, k, v)
                        else:
                            raise eimaginary.AmbiguousArgument(self, k, v, objs)
                return self.do(actor, line, **match)
            finally:
                end = time.time()
                log.msg(interface=iaxiom.IStatEvent,
                        stat_actionDuration=end - begin,
                        stat_actionExecuted=1)
        events.runEventTransaction(player.store, thunk)
Take a player, input, and dictionary of parse results, resolve those
dataset/ETHPy150Open twisted/imaginary/imaginary/action.py/Action.runEventTransaction