code: func NewTokenCleaner(cl clientset.Interface, secrets coreinformers.SecretInformer, options TokenCleanerOptions) (*TokenCleaner, error) {
  	e := &TokenCleaner{
  		client:               cl,
  		secretLister:         secrets.Lister(),
  		secretSynced:         secrets.Informer().HasSynced,
  		tokenSecretNamespace: options.TokenSecretNamespace,
  		queue:                workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "token_cleaner"),
  	}
  
  	if cl.CoreV1().RESTClient().GetRateLimiter() != nil {
  		if err := metrics.RegisterMetricAndTrackRateLimiterUsage("token_cleaner", cl.CoreV1().RESTClient().GetRateLimiter()); err != nil {
  			return nil, err
  		}
  	}
  
  	secrets.Informer().AddEventHandlerWithResyncPeriod(
  		cache.FilteringResourceEventHandler{
  			FilterFunc: func(obj interface{}) bool {
  				switch t := obj.(type) {
  				case *v1.Secret:
  					return t.Type == bootstrapapi.SecretTypeBootstrapToken && t.Namespace == e.tokenSecretNamespace
  				default:
  					utilruntime.HandleError(fmt.Errorf("object passed to %T that is not expected: %T", e, obj))
  					return false
  				}
  			},
  			Handler: cache.ResourceEventHandlerFuncs{
  				AddFunc:    e.enqueueSecrets,
  				UpdateFunc: func(oldSecret, newSecret interface{}) { e.enqueueSecrets(newSecret) },
  			},
  		},
  		options.SecretResync,
  	)
  
  	return e, nil
  }
docs: // NewTokenCleaner returns a new *NewTokenCleaner.