code: func (c *clientWrapper) WatchAll(namespaces k8s.Namespaces, stopCh <-chan struct{}) (<-chan interface{}, error) {
  	eventCh := make(chan interface{}, 1)
  	eventHandler := c.newResourceEventHandler(eventCh)
  
  	if len(namespaces) == 0 {
  		namespaces = k8s.Namespaces{metav1.NamespaceAll}
  		c.isNamespaceAll = true
  	}
  
  	c.watchedNamespaces = namespaces
  
  	for _, ns := range namespaces {
  		factory := informers.NewFilteredSharedInformerFactory(c.clientset, resyncPeriod, ns, nil)
  		factory.Extensions().V1beta1().Ingresses().Informer().AddEventHandler(eventHandler)
  		factory.Core().V1().Services().Informer().AddEventHandler(eventHandler)
  		factory.Core().V1().Endpoints().Informer().AddEventHandler(eventHandler)
  		c.factories[ns] = factory
  	}
  
  	for _, ns := range namespaces {
  		c.factories[ns].Start(stopCh)
  	}
  
  	for _, ns := range namespaces {
  		for t, ok := range c.factories[ns].WaitForCacheSync(stopCh) {
  			if !ok {
  				return nil, fmt.Errorf("timed out waiting for controller caches to sync %s in namespace %q", t.String(), ns)
  			}
  		}
  	}
  
  	// Do not wait for the Secrets store to get synced since we cannot rely on
  	// users having granted RBAC permissions for this object.
  	// https://github.com/containous/traefik/issues/1784 should improve the
  	// situation here in the future.
  	for _, ns := range namespaces {
  		c.factories[ns].Core().V1().Secrets().Informer().AddEventHandler(eventHandler)
  		c.factories[ns].Start(stopCh)
  	}
  
  	return eventCh, nil
  }
docs: // WatchAll starts namespace-specific controllers for all relevant kinds.