# add an event listener, this ensure that 
    # on value changes the UI will react
    self.addEventListener('valueChanged', self.__onValueChanged)

  def getC(self):
    self.getDGNode().evaluate()
    return self.getDGNode().getValue('c',  0)

  def __onValueChanged(self, data):
    if data['name'] in ['a', 'b']:
      self.getParameter('c').fireValueChangedEvent()

if __name__ == "__main__":
  # construct a scene
  # this manages the Core client
  scene = Scene()

  # construct a new SceneGraphNode
  myNode = MyNode(scene)

  # perform a full check on the 
  # DG layout, operator source code etc
  scene.checkErrors()

  # set some data
  myNode.getParameter('a').setValue(7.0)
  myNode.getParameter('b').setValue(9.0)

  # evaluate and return
  print myNode.getParameter('c').getValue()
          name = 'addOp', 
          fileName = '2_basicMath.kl',
          layout = [
            'self.index',
            'values.a<>',
            'values.b<>',
            'self.sum'
          ]
        )

        self.__operatorsConstructed = True

  def compute(self):
    self.getDGNode('Calculator').evaluate()

# setup a scene and two nodes
scene = Scene(None)
values = MyValuesNode(scene, count = 10)
results = MyResultsNode(scene)

# connect them through the reference interface
results.getInPort('Values').setConnectedNode(values)

# check errors
scene.checkErrors()

# fire computation
results.compute()

# destroy all objects
scene.close()