/// <summary>
        /// Subscribe to start recieving Update calls
        /// </summary>
        /// <param name="obj"></param>
        public static void Subscribe(IUnityEvents obj
#if ORDERED_GENERICS
                                     , int executionOrder = 0
#endif
                                     )
        {
            if (obj == null || Contains(obj))
            {
                return;
            }

            try
            {
                obj.OnSubscribe();
            }
            catch (Exception e)
            {
                Debug.LogError(e.ToString());
            }
#if ORDERED_GENERICS
            Wrapper w = new Wrapper(obj, executionOrder);
            Add(w, s_generics);
#else
            s_generics.Add(obj);
#endif
        }
        /// <summary>
        /// Unsubscribe to stop recieving Update calls
        /// </summary>
        /// <param name="obj"></param>
        public static void UnSubscribe(IUnityEvents obj)
        {
            if (obj == null || !Contains(obj))
            {
                return;
            }

            try
            {
                obj.OnUnSubscribe();
            }
            catch (Exception e)
            {
                Debug.LogError(e.ToString());
            }
            //Currently in a foreach loop so we cannot edit the data types yet.
            if (s_looping)
            {
                s_toRemove.Enqueue(obj);
                return;
            }
#if ORDERED_GENERICS
            Remove(obj, s_generics);
#else
            s_generics.Remove(obj);
#endif
        }
        private static bool Contains(IUnityEvents obj)
        {
#if ORDERED_GENERICS
            foreach (var e in s_generics)
            {
                if (e.Equals(obj))
                {
                    return(true);
                }
            }

            return(false);
#else
            return(s_generics.Contains(obj));
#endif
        }
        /// <summary>
        /// Queues for Awake & Start calls before subscribing for Update calls
        /// </summary>
        /// <param name="obj"></param>
        public static void Instantiate(IUnityEvents obj
#if ORDERED_GENERICS
                                       , int executionOrder = 0
#endif
                                       )
        {
            if (obj == null || Contains(obj))
            {
                return;
            }

            obj.OnSubscribe();
#if ORDERED_GENERICS
            Wrapper w = new Wrapper(obj, executionOrder);
            Add(w, s_toInitialize);
#else
            s_toInitialize.Add(obj);
#endif
        }
 public bool Equals(IUnityEvents other) => obj == other;
 public Wrapper(IUnityEvents i, int order)
 {
     obj            = i;
     executionOrder = order;
 }
 private static void Remove(IUnityEvents w, List <Wrapper> list)
 {
     list.RemoveAll((wrapper) => wrapper.Equals(w));
 }