code: func (d *SerialDispatcher) Dispatch(cmd interface{}) (err error) {
  	d.mutex.RLock()
  	defer d.mutex.RUnlock()
  
  	defer func() {
  		if e := recover(); e != nil {
  			err = e.(error)
  		}
  	}()
  
  	found := false
  	for _, handler := range d.handlers {
  		if handler == nil {
  			continue
  		}
  		if !handler.CanHandle(cmd) {
  			continue
  		}
  		found = true
  		if err = handler.Handle(cmd, d); err != nil {
  			return
  		}
  	}
  
  	if !found {
  		return &NoHandlerFoundError{
  			Command: cmd,
  		}
  	}
  
  	return
  }
docs: // Dispatch implements `Dispatcher.Dispatch`