/// <summary>
        /// Adds the event listener.
        /// </summary>
        /// <returns>
        /// The event listener.
        /// </returns>
        /// <param name='aEventName_string'>
        /// If set to <c>true</c> a event type_string.
        /// </param>
        /// <param name='aEventDelegate'>
        /// If set to <c>true</c> a event delegate.
        /// </param>
        /// <param name='aEventDispatcherAddMode'>
        /// If set to <c>true</c> event listening mode.
        /// </param>
        public bool addEventListener(string aEventName_string, EventDelegate aEventDelegate, EventDispatcherAddMode aEventDispatcherAddMode)
        {
            //
            bool wasSuccessful_boolean = false;

            //
            object aIEventListener = _getArgumentsCallee(aEventDelegate);

            //
            if (aIEventListener != null && aEventName_string != null)
            {
                //	OUTER
                string keyForOuterHashTable_string = _getKeyForOuterHashTable(aEventName_string);
                if (!_eventListenerDatas_hashtable.ContainsKey(keyForOuterHashTable_string))
                {
                    _eventListenerDatas_hashtable.Add(keyForOuterHashTable_string, new Hashtable());
                }

                //	INNER
                Hashtable         inner_hashtable   = _eventListenerDatas_hashtable[keyForOuterHashTable_string] as Hashtable;
                EventListenerData eventListenerData = new EventListenerData(aIEventListener, aEventName_string, aEventDelegate, aEventDispatcherAddMode);
                //
                string keyForInnerHashTable_string = _getKeyForInnerHashTable(eventListenerData);
                if (inner_hashtable.Contains(keyForInnerHashTable_string))
                {
                    //THIS SHOULD *NEVER* HAPPEN - REMOVE AFTER TESTED WELL
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);
                }
                else
                {
                    //	ADD
                    inner_hashtable.Add(keyForInnerHashTable_string, eventListenerData);
                    wasSuccessful_boolean = true;
                    //Debug.Log ("	ADDED AT: " + keyForInnerHashTable_string + " = " +  eventListenerData);
                }
            }
            return(wasSuccessful_boolean);
        }
 private string _getKeyForInnerHashTable(EventListenerData aEventListenerData)
 {
     //VERY UNIQUE - NICE!
     return(aEventListenerData.eventListener.GetType().FullName + "_" + aEventListenerData.eventListener.GetType().GUID + "_" + aEventListenerData.eventName + "_" + (aEventListenerData.eventDelegate as System.Delegate).Method.Name.ToString());
 }
 private string _getKeyForInnerHashTable(EventListenerData aEventListenerData)
 {
     //VERY UNIQUE - NICE!
     return aEventListenerData.eventListener.GetType().FullName + "_" + aEventListenerData.eventListener.GetType().GUID + "_" + aEventListenerData.eventName + "_" + (aEventListenerData.eventDelegate as System.Delegate).Method.Name.ToString();
 }
        /// <summary>
        /// Adds the event listener.
        /// </summary>
        /// <returns>
        /// The event listener.
        /// </returns>
        /// <param name='aEventName_string'>
        /// If set to <c>true</c> a event type_string.
        /// </param>
        /// <param name='aEventDelegate'>
        /// If set to <c>true</c> a event delegate.
        /// </param>
        /// <param name='aEventDispatcherAddMode'>
        /// If set to <c>true</c> event listening mode.
        /// </param>
        public bool addEventListener(string aEventName_string, EventDelegate aEventDelegate, EventDispatcherAddMode aEventDispatcherAddMode)
        {
            //
            bool wasSuccessful_boolean = false;

            //
            object aIEventListener = _getArgumentsCallee(aEventDelegate);

            //
            if (aIEventListener != null && aEventName_string != null) {

                //	OUTER
                string keyForOuterHashTable_string = _getKeyForOuterHashTable (aEventName_string);
                if (!_eventListenerDatas_hashtable.ContainsKey(keyForOuterHashTable_string) ) {
                    _eventListenerDatas_hashtable.Add(keyForOuterHashTable_string, new Hashtable());
                }

                //	INNER
                Hashtable inner_hashtable = _eventListenerDatas_hashtable[keyForOuterHashTable_string] as Hashtable;
                EventListenerData eventListenerData = new EventListenerData (aIEventListener, aEventName_string, aEventDelegate, aEventDispatcherAddMode);
                //
                string keyForInnerHashTable_string = _getKeyForInnerHashTable (eventListenerData);
                if (inner_hashtable.Contains(keyForInnerHashTable_string)) {

                    //THIS SHOULD *NEVER* HAPPEN - REMOVE AFTER TESTED WELL
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);
                    Debug.Log("Event Manager: Listener: " + keyForInnerHashTable_string + " is already in list for event: " + keyForOuterHashTable_string);

                } else {

                    //	ADD
                    inner_hashtable.Add(keyForInnerHashTable_string, eventListenerData);
                    wasSuccessful_boolean = true;
                    //Debug.Log ("	ADDED AT: " + keyForInnerHashTable_string + " = " +  eventListenerData);
                }

            }
            return wasSuccessful_boolean;
        }