code: func (d *dispatcher) addListener(targetID, eventName string, l Listener) {
  	d.m.Lock()
  	defer d.m.Unlock()
  	if _, ok := d.l[targetID]; !ok {
  		d.l[targetID] = make(map[string]map[int]Listener)
  	}
  	if _, ok := d.l[targetID][eventName]; !ok {
  		d.l[targetID][eventName] = make(map[int]Listener)
  	}
  	d.id++
  	d.l[targetID][eventName][d.id] = l
  }
docs: // addListener adds a listener