'Collect all input values, attempt to process new output values, and propagate downstream.
Subclasses should call update() whenever thir internal state has changed
(such as when the user interacts with the Node\'s control widget). Update
is automatically called when the inputs to the node are changed.'

def update(self, signal=True):

    vals = self.inputValues()
    try:
        if self.isBypassed():
            out = self.processBypassed(vals)
        else:
            out = self.process(**strDict(vals))
        if (out is not None):
            if signal:
                self.setOutput(**out)
            else:
                self.setOutputNoSignal(**out)
        for (n, t) in self.inputs().items():
            t.setValueAcceptable(True)
        self.clearException()
    except:
        for (n, t) in self.outputs().items():
            t.setValue(None)
        self.setException(sys.exc_info())
        if signal:
            self.sigOutputChanged.emit(self)
