code: func AllPlugins(plugins ...infra.Plugin) Option {
  	return func(o *Options) {
  		infraLogger.Debugf("AllPlugins with %d plugins", len(plugins))
  
  		for _, plugin := range plugins {
  			typ := reflect.TypeOf(plugin)
  			infraLogger.Debugf("searching for all deps in: %v (type: %v)", plugin, typ)
  
  			foundPlugins, err := findPlugins(reflect.ValueOf(plugin), o.pluginMap)
  			if err != nil {
  				panic(err)
  			}
  
  			infraLogger.Debugf("found %d plugins in: %v (type: %v)", len(foundPlugins), plugin, typ)
  			for _, plug := range foundPlugins {
  				infraLogger.Debugf(" - plugin: %v (%v)", plug, reflect.TypeOf(plug))
  
  				if _, ok := o.pluginNames[plug.String()]; ok {
  					infraLogger.Fatalf("plugin with name %q already registered", plug.String())
  				}
  				o.pluginNames[plug.String()] = struct{}{}
  			}
  			o.Plugins = append(o.Plugins, foundPlugins...)
  
  			// TODO: perhaps set plugin name to typ.String() if it's empty
  			/*p, ok := plugin.(core.PluginNamed)
  			if !ok {
  				p = core.NamePlugin(typ.String(), plugin)
  			}*/
  
  			if _, ok := o.pluginNames[plugin.String()]; ok {
  				infraLogger.Fatalf("plugin with name %q already registered, custom name should be used", plugin.String())
  			}
  			o.pluginNames[plugin.String()] = struct{}{}
  			o.Plugins = append(o.Plugins, plugin)
  		}
  	}
  }
docs: // AllPlugins creates an Option that adds all of the nested
  // plugins recursively to the Agent's plugin list.