Welcome to the forum @dmiller!
To connect a Node or Ensemble to a SPA object, you have to access the input/output nodes of the SPA object. For example,
D = 32
ens = nengo.Ensemble(100, 32)
state = nengo.State(32)
nengo.Connection(ens, state.input)
For wrapping a complicated interface in a class, I would recommend looking at the Delay Node example and the Counter example. Both of them show how to get a system to react through a function input in a node, but also while executing more complicated code each time step. Please let me know if you need further guidance beyond these examples! I’m not trying to dismiss you. Just wanted to establish a common ground of understanding before going deeper.