using System; namespace IPA { internal enum EdgeLifecycleType { Enable, Disable } internal interface IEdgeLifecycleAttribute { EdgeLifecycleType Type { get; } } // TODO: is there a better way to manage this mess? /// /// Indicates that the target method should be called when the plugin is enabled. /// /// /// /// This attribute is interchangable with , and is treated identically. /// They are seperate to allow plugin code to more clearly describe the intent of the methods. /// /// /// Typically, this will be used when the parameter of the plugins's /// is . /// /// /// The method marked by this attribute will always be called from the Unity main thread. /// /// /// /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class OnEnableAttribute : Attribute, IEdgeLifecycleAttribute { EdgeLifecycleType IEdgeLifecycleAttribute.Type => EdgeLifecycleType.Enable; } /// /// Indicates that the target method should be called when the game starts. /// /// /// /// This attribute is interchangable with , and is treated identically. /// They are seperate to allow plugin code to more clearly describe the intent of the methods. /// /// /// Typically, this will be used when the parameter of the plugins's /// is . /// /// /// The method marked by this attribute will always be called from the Unity main thread. /// /// /// /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class OnStartAttribute : Attribute, IEdgeLifecycleAttribute { EdgeLifecycleType IEdgeLifecycleAttribute.Type => EdgeLifecycleType.Enable; } /// /// Indicates that the target method should be called when the plugin is disabled. /// /// /// /// This attribute is interchangable with , and is treated identically. /// They are seperate to allow plugin code to more clearly describe the intent of the methods. /// /// /// Typically, this will be used when the parameter of the plugins's /// is . /// /// /// The method marked by this attribute will always be called from the Unity main thread. /// /// /// /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class OnDisableAttribute : Attribute, IEdgeLifecycleAttribute { EdgeLifecycleType IEdgeLifecycleAttribute.Type => EdgeLifecycleType.Disable; } /// /// Indicates that the target method should be called when the game exits. /// /// /// /// This attribute is interchangable with , and is treated identically. /// They are seperate to allow plugin code to more clearly describe the intent of the methods. /// /// /// Typically, this will be used when the parameter of the plugins's /// is . /// /// /// The method marked by this attribute will always be called from the Unity main thread. /// /// /// /// [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = false)] public sealed class OnExitAttribute : Attribute, IEdgeLifecycleAttribute { EdgeLifecycleType IEdgeLifecycleAttribute.Type => EdgeLifecycleType.Disable; } /// /// Indicates that the applied plugin class does not need or /// methods. /// /// /// This is typically only the ccase when some other utility mod handles their lifecycle for /// them, such as with SiraUtil and Zenject. /// /// /// [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)] public sealed class NoEnableDisableAttribute : Attribute { } }