code: func NewController(kubeClient clientset.Interface) (*Controller, error) {
  	eventBroadcaster := record.NewBroadcaster()
  	eventBroadcaster.StartLogging(klog.Infof)
  	eventBroadcaster.StartRecordingToSink(&v1core.EventSinkImpl{Interface: kubeClient.CoreV1().Events("")})
  
  	if kubeClient != nil && kubeClient.CoreV1().RESTClient().GetRateLimiter() != nil {
  		if err := metrics.RegisterMetricAndTrackRateLimiterUsage("cronjob_controller", kubeClient.CoreV1().RESTClient().GetRateLimiter()); err != nil {
  			return nil, err
  		}
  	}
  
  	jm := &Controller{
  		kubeClient: kubeClient,
  		jobControl: realJobControl{KubeClient: kubeClient},
  		sjControl:  &realSJControl{KubeClient: kubeClient},
  		podControl: &realPodControl{KubeClient: kubeClient},
  		recorder:   eventBroadcaster.NewRecorder(scheme.Scheme, v1.EventSource{Component: "cronjob-controller"}),
  	}
  
  	return jm, nil
  }
docs: // NewController creates and initializes a new Controller.