code: func (w *Watcher) Add(d dep.Dependency) (bool, error) {
  	w.Lock()
  	defer w.Unlock()
  
  	log.Printf("[DEBUG] (watcher) adding %s", d)
  
  	if _, ok := w.depViewMap[d.String()]; ok {
  		log.Printf("[TRACE] (watcher) %s already exists, skipping", d)
  		return false, nil
  	}
  
  	// Choose the correct retry function based off of the dependency's type.
  	var retryFunc RetryFunc
  	switch d.Type() {
  	case dep.TypeConsul:
  		retryFunc = w.retryFuncConsul
  	case dep.TypeVault:
  		retryFunc = w.retryFuncVault
  	default:
  		retryFunc = w.retryFuncDefault
  	}
  
  	v, err := NewView(&NewViewInput{
  		Dependency: d,
  		Clients:    w.clients,
  		MaxStale:   w.maxStale,
  		Once:       w.once,
  		RetryFunc:  retryFunc,
  		VaultGrace: w.vaultGrace,
  	})
  	if err != nil {
  		return false, errors.Wrap(err, "watcher")
  	}
  
  	log.Printf("[TRACE] (watcher) %s starting", d)
  
  	w.depViewMap[d.String()] = v
  	go v.poll(w.dataCh, w.errCh)
  
  	return true, nil
  }
docs: // Add adds the given dependency to the list of monitored dependencies
  // and start the associated view. If the dependency already exists, no action is
  // taken.
  //
  // If the Dependency already existed, it this function will return false. If the
  // view was successfully created, it will return true. If an error occurs while
  // creating the view, it will be returned here (but future errors returned by
  // the view will happen on the channel).