code: func (ps *Plugins) NewFromPlugins(pluginNames []string, configProvider ConfigProvider, pluginInitializer PluginInitializer, decorator Decorator) (Interface, error) {
  	handlers := []Interface{}
  	mutationPlugins := []string{}
  	validationPlugins := []string{}
  	for _, pluginName := range pluginNames {
  		pluginConfig, err := configProvider.ConfigFor(pluginName)
  		if err != nil {
  			return nil, err
  		}
  
  		plugin, err := ps.InitPlugin(pluginName, pluginConfig, pluginInitializer)
  		if err != nil {
  			return nil, err
  		}
  		if plugin != nil {
  			if decorator != nil {
  				handlers = append(handlers, decorator.Decorate(plugin, pluginName))
  			} else {
  				handlers = append(handlers, plugin)
  			}
  
  			if _, ok := plugin.(MutationInterface); ok {
  				mutationPlugins = append(mutationPlugins, pluginName)
  			}
  			if _, ok := plugin.(ValidationInterface); ok {
  				validationPlugins = append(validationPlugins, pluginName)
  			}
  		}
  	}
  	if len(mutationPlugins) != 0 {
  		klog.Infof("Loaded %d mutating admission controller(s) successfully in the following order: %s.", len(mutationPlugins), strings.Join(mutationPlugins, ","))
  	}
  	if len(validationPlugins) != 0 {
  		klog.Infof("Loaded %d validating admission controller(s) successfully in the following order: %s.", len(validationPlugins), strings.Join(validationPlugins, ","))
  	}
  	return chainAdmissionHandler(handlers), nil
  }
docs: // NewFromPlugins returns an admission.Interface that will enforce admission control decisions of all
  // the given plugins.