import copy class ctx_Controller: def __init__(self, c): self.callbacks = [] self.context = c self.functions = [] self.isProcessingQueue = False self.queue = [] def executeFunctions(self): c = self.queue.pop(0) for f in self.functions: ctx = f(c) if ctx.recentField != "none": self.queue.append(ctx) self.context.recentField = c.recentField self.context.setField(c.recentField, c.field(c.recentField)) self.reportContext() def processQueue(self): # Decline recursion. if self.isProcessingQueue: return self.isProcessingQueue = True while len(self.queue) > 0: self.executeFunctions() self.isProcessingQueue = False def registerCallback(self, cb): self.callbacks.append(cb) def registerFieldCallback(self, fieldName, cb): self.callbacks.append(lambda c: cb(c) if c.recentField == fieldName else None) def registerFunction(self, f): self.functions.append(f) def registerFunctions(self, funcs): for f in funcs: self.functions.append(f) def reportContext(self): for cb in self.callbacks: cb(self.context) def set(self, fieldName, value): c = copy.deepcopy(self.context) c.setField(fieldName, value) c.recentField = fieldName self.queue.append(c) self.processQueue()