code: func (link *ToxicLink) AddToxic(toxic *toxics.ToxicWrapper) {
  	i := len(link.stubs)
  
  	newin := make(chan *stream.StreamChunk, toxic.BufferSize)
  	link.stubs = append(link.stubs, toxics.NewToxicStub(newin, link.stubs[i-1].Output))
  
  	// Interrupt the last toxic so that we don't have a race when moving channels
  	if link.stubs[i-1].InterruptToxic() {
  		link.stubs[i-1].Output = newin
  
  		if stateful, ok := toxic.Toxic.(toxics.StatefulToxic); ok {
  			link.stubs[i].State = stateful.NewState()
  		}
  
  		go link.stubs[i].Run(toxic)
  		go link.stubs[i-1].Run(link.toxics.chain[link.direction][i-1])
  	} else {
  		// This link is already closed, make sure the new toxic matches
  		link.stubs[i].Output = newin // The real output is already closed, close this instead
  		link.stubs[i].Close()
  	}
  }
docs: // Add a toxic to the end of the chain.