using System; using StardewModdingAPI.Events; namespace StardewModdingAPI.Framework.Events { /// An event handler wrapper which tracks metadata about an event handler. /// The event arguments type. internal class ManagedEventHandler : IComparable { /********* ** Accessors *********/ /// The event handler method. public EventHandler Handler { get; } /// The order in which the event handler was registered, relative to other handlers for this event. public int RegistrationOrder { get; } /// The event handler priority, relative to other handlers for this event. public EventPriority Priority { get; } /// The mod which registered the handler. public IModMetadata SourceMod { get; set; } /********* ** Accessors *********/ /// Construct an instance. /// The event handler method. /// The order in which the event handler was registered, relative to other handlers for this event. /// The event handler priority, relative to other handlers for this event. /// The mod which registered the handler. public ManagedEventHandler(EventHandler handler, int registrationOrder, EventPriority priority, IModMetadata sourceMod) { this.Handler = handler; this.RegistrationOrder = registrationOrder; this.Priority = priority; this.SourceMod = sourceMod; } /// public int CompareTo(object? obj) { if (obj is not ManagedEventHandler other) throw new ArgumentException("Can't compare to an unrelated object type."); int priorityCompare = -this.Priority.CompareTo(other.Priority); // higher value = sort first return priorityCompare != 0 ? priorityCompare : this.RegistrationOrder.CompareTo(other.RegistrationOrder); } } }