private bool remove_listener(string event_name, PurpleLogCallback listener)
 {
     if (eventListeners.ContainsKey (event_name))
     {
         eventListeners[event_name] -= listener;
         return true;
     }
     return false;
 }
 public static bool RemoveListener(string event_name, PurpleLogCallback listener)
 {
     return Instance.remove_listener (event_name, listener);
 }
    // EVENT DISPATCH ////////////////////
    private void add_listener(string event_name, PurpleLogCallback listener)
    {
        if (!eventListeners.ContainsKey (event_name))
        {
            eventListeners.Add(event_name, null);
        }

        // prevent chaining the same delegate listener multiple times
        if(eventListeners[event_name] != null)
        {
            Delegate [] callbackList = eventListeners[event_name].GetInvocationList();
            foreach(PurpleLogCallback singleCallback in callbackList)
            {
                if(listener.Method.Name == singleCallback.Method.Name)
                    return;
            }
        }
        // delegates can be chained using addition
        eventListeners[event_name] += listener;
    }
 public static void AddListener(string event_name, PurpleLogCallback listener)
 {
     Instance.add_listener(event_name, listener);
 }