static void BufferEvent(IEvent evt, ref BufferedEventHolder holder)
        {
            string eventName = evt.GetName();

            Queue <BufferedEventHolder> currentBuffer;

            if (!bufferedEvents.ContainsKey(eventName))
            {
                currentBuffer = new Queue <BufferedEventHolder>();
                bufferedEvents.Add(eventName, currentBuffer);
            }
            else
            {
                currentBuffer = bufferedEvents[eventName];
            }

            //if we have exceeded the maximum buffer size for this event then discard the oldest event
            if (currentBuffer.Count > MaximumBufferSizePerEvent)
            {
                Debug.LogWarning("Event Manager: Maximum buffered event size reach for Event \"" + eventName + "\".");
                currentBuffer.Dequeue();
            }

            holder = new BufferedEventHolder(evt);
            unhandledBuffers.Add(holder);
            currentBuffer.Enqueue(holder);
        }
        static void UnbufferEvent(BufferedEventHolder holder)
        {
            if (holder == null)
            {
                return;
            }

            holder.HasEverBeenHandled = true;
            holder.LastHandledDate    = ListenerAttachDate;
            if (unhandledBuffers.Contains(holder))
            {
                unhandledBuffers.Remove(holder);
            }
        }
        /// <summary>
        /// Triggers an event instantly.
        /// All listeners will execute their handleEvent inside this block, even if it is a widely subscribed event
        /// </summary>
        /// <param name="evt"></param>
        /// <returns></returns>
        public static bool TriggerEvent(IEvent evt, bool shouldBuffer = false)
        {
            string eventName = CheckEventName(evt);
            BufferedEventHolder currentBufferHolder = null;

            //checking to see if the event should get saved for buffered recievers
            if (shouldBuffer)
            {
                BufferEvent(evt, ref currentBufferHolder);
            }
            else if (HasNoListeners(eventName))
            {
                return(false);
            }

            ArrayList listenerList = _listenerTable[eventName] as ArrayList;

            if (listenerList == null)
            {
                return(true);
            }

            //  Changed this to a for loop because detaching a listener during the enumeration causes errors.
            for (var i = listenerList.Count - 1; i >= 0; --i)
            {
                i = Mathf.Clamp(i, 0, listenerList.Count - 1);  //  Ran into a case once where i became out of range.  Band-aid fix.  I tried moving anything that modifies _listenerTable to outside this loop with no good results.
                var listener = (IEventListener)listenerList[i];
                if (!ValidateListener(1, listener, eventName))
                {
                    continue;
                }

                // THE ACTUAL EVENT HANDLER //
                if (listener.HandleEvent(evt) == ListenerResult.Ignored)
                {
                    Debug.LogError("The listener, " + listener + " appears to be ignoring the event, " + evt.GetName() + " to which it is subscribed. This is not optimal.");
                }
                else if (shouldBuffer)
                {
                    UnbufferEvent(currentBufferHolder);
                }
            }

            return(true);
        }