code: func NewCRDFinalizer(
  	crdInformer informers.CustomResourceDefinitionInformer,
  	crdClient client.CustomResourceDefinitionsGetter,
  	crClientGetter CRClientGetter,
  ) *CRDFinalizer {
  	c := &CRDFinalizer{
  		crdClient:      crdClient,
  		crdLister:      crdInformer.Lister(),
  		crdSynced:      crdInformer.Informer().HasSynced,
  		crClientGetter: crClientGetter,
  		queue:          workqueue.NewNamedRateLimitingQueue(workqueue.DefaultControllerRateLimiter(), "crd_finalizer"),
  	}
  
  	crdInformer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{
  		AddFunc:    c.addCustomResourceDefinition,
  		UpdateFunc: c.updateCustomResourceDefinition,
  	})
  
  	c.syncFn = c.sync
  
  	return c
  }
docs: // NewCRDFinalizer creates a new CRDFinalizer.