private IEnumerator FireEventRoutine(EventInfoBase eventInfo, Type trueEventInfoClass)
        {
            object[] param = new object[1] {
                eventInfo
            };

            if (globalEventListeners.ContainsKey(trueEventInfoClass))
            {
                foreach (Tuple <MethodInfo, object> tuple in globalEventListeners[trueEventInfoClass])
                {
                    tuple.Item1.Invoke(tuple.Item2, param);
                }
            }

            if (unityEventListeners == null)
            {
                yield break;
            }
            if (!unityEventListeners.ContainsKey(trueEventInfoClass))
            {
                yield break;
            }

            foreach (UnityEventEventInfo unityEventInfo in unityEventListeners[trueEventInfoClass])
            {
                unityEventInfo.Invoke(eventInfo);
            }

            yield return(null);
        }
 /// <summary>
 /// Fires an event of type EventInfoParameter ONLY to the components on this game object
 /// who have subscribed
 /// </summary>
 /// <param name="eventInfo"></param>
 public void FireLocalEvent(EventInfoBase eventInfo)
 {
     if (!enabled)
     {
         return;
     }
     StartCoroutine(Fire(eventInfo));
     StartCoroutine(FireUnityEvents(eventInfo));
 }
        public void FireGlobalEvent(EventInfoBase eventInfo)
        {
            System.Type trueEventInfoClass = eventInfo.GetType();

            if ((globalEventListeners == null || !globalEventListeners.ContainsKey(trueEventInfoClass)) &&
                (unityEventListeners == null || !unityEventListeners.ContainsKey(trueEventInfoClass)))
            {
                // No one is listening, we are done.
                return;
            }

            StartCoroutine(FireEventRoutine(eventInfo, trueEventInfoClass));
        }
        private IEnumerator FireUnityEvents(EventInfoBase eventInfo)
        {
            System.Type trueEventInfoClass = eventInfo.GetType();

            if (unityEventListeners == null)
            {
                yield break;
            }

            foreach (Dictionary <System.Type, List <UnityEventEventInfo> > eventListeners in unityEventListeners.Values)
            {
                if (!eventListeners.ContainsKey(trueEventInfoClass) || eventListeners[trueEventInfoClass] == null)
                {
                    // No one is listening, we are done.
                    continue;
                }

                foreach (UnityEventEventInfo el in eventListeners[trueEventInfoClass])
                {
                    el.Invoke(eventInfo);
                }
            }
            yield return(null);
        }
        private IEnumerator Fire(EventInfoBase eventInfo)
        {
            System.Type trueEventInfoClass = eventInfo.GetType();

            if (instanceEventListeners == null)
            {
                yield break;
            }

            foreach (Dictionary <System.Type, List <LocalEventListener> > eventListeners in instanceEventListeners.Values)
            {
                if (!eventListeners.ContainsKey(trueEventInfoClass) || eventListeners[trueEventInfoClass] == null)
                {
                    // No one is listening, we are done.
                    continue;
                }

                foreach (LocalEventListener el in eventListeners[trueEventInfoClass])
                {
                    el(eventInfo);
                }
            }
            yield return(null);
        }