namespace Pilz.Features; public abstract class PluginFunction : PluginFeature { protected PluginFunction(string type, string identifier) : base(type, identifier) { } protected PluginFunction(string type, string identifier, string? name) : base(type, identifier, name) { } public virtual object? Execute() { return Execute((PluginFunctionParameter?)null); } public virtual T? Execute(params object?[]? @params) { return Execute(new PluginFunctionSimpleParamter(@params)); } public virtual object? Execute(params object?[]? @params) { return Execute(new PluginFunctionSimpleParamter(@params)); } public virtual T? Execute(PluginFunctionSimpleParamter? @params) { if (Execute(@params) is T result) return result; return default; } public virtual object? Execute(PluginFunctionParameter? @params) { object? result = default; if (OnPreExecute(@params, ref result)) result = ExecuteFunction(@params); OnPostExecute(@params, ref result); return result; } protected abstract object? ExecuteFunction(PluginFunctionParameter? @params); }