using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Pilz.Plugins.Advanced { public sealed class PluginFeatureController { /// /// The default public instance that can be used by plugins and the interface providing software. /// public static PluginFeatureController Instance { get; private set; } = new(); private readonly List features = new(); /// /// A wrapper of all registred instances. /// public FeatureController Features { get; init; } /// /// A wrapper for all registred instances. /// public ModuleController Modules { get; init; } /// /// A wrapper for all registred instances. /// public FunctionController Functions { get; init; } public PluginFeatureController() { Features = new(this); Functions = new(this); Modules = new(this); } public void Register(PluginFeature module) { if (!features.Contains(module)) features.Add(module); } public void Unregister(PluginFeature module) { features.Remove(module); } public class FeatureController { protected readonly PluginFeatureController controller; public FeatureController(PluginFeatureController controller) { this.controller = controller; } public virtual IEnumerable GetAll() { return controller.features.AsReadOnly(); } public virtual IEnumerable Get(string moduleType) { return controller.features.Where(n => n.Type == moduleType); } public virtual PluginFeature? GetFirst(string moduleType) { return controller.features.FirstOrDefault(n => n.Type == moduleType); } } public class FeatureController : FeatureController where T : PluginFeature { public FeatureController(PluginFeatureController controller) : base(controller) { } public override IEnumerable GetAll() { return controller.features.OfType(); } public override IEnumerable Get(string moduleType) { return GetAll().Where(n => n.Type == moduleType); } public override T? GetFirst(string moduleType) { return GetAll().FirstOrDefault(n => n.Type == moduleType); } } public class ModuleController : FeatureController { public ModuleController(PluginFeatureController controller) : base(controller) { } } public class FunctionController : FeatureController { public FunctionController(PluginFeatureController controller) : base(controller) { } public void ExecuteAll(string functionType) { foreach (var function in Get(functionType)) function.Execute(); } public void ExecuteAll(string functionType, params object?[]? @params) { foreach (var function in Get(functionType)) function.Execute(@params); } public void ExecuteAll(string functionType, PluginFunctionParameter @params) { foreach (var function in Get(functionType)) function.Execute(@params); } public IEnumerable ExcuteAndGetResults(string functionType) { return Get(functionType).Select(n => n.Execute()); } public IEnumerable ExcuteAndGetResults(string functionType, params object?[]? @params) { return Get(functionType).Select(n => n.Execute(@params)); } public IEnumerable ExcuteAndGetResults(string functionType, PluginFunctionParameter @params) { return Get(functionType).Select(n => n.Execute(@params)); } } } }