/// <summary>
        /// Adds the event listener.
        /// </summary>
        /// <returns>
        /// When 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("TODO (FIX THIS): 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();
		
		}
		/// <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("TODO (FIX THIS): 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());
 }