/// <summary>
    /// Objects call this to unsubscribe to events of a given type.
    /// </summary>
    /// <param name="handler">The function that was called when the event occurred.</param>
    /// <typeparam name="T">The type of the event.</typeparam>
    public void Unregister <T>(CustomEvent.Handler handler) where T : CustomEvent
    {
        Type type = typeof(T);

        CustomEvent.Handler handlers;

        if (registeredHandlers.TryGetValue(type, out handlers))
        {
            handlers -= handler;

            if (handlers == null)
            {
                registeredHandlers.Remove(type);
            }
            else
            {
                registeredHandlers[type] = handlers;
            }
        }
    }
    /// <summary>
    /// Objects call this function to subscribe to events of a given type.
    /// </summary>
    /// <param name="handler">The function to be called when the event occurs.</param>
    /// <typeparam name="T">The type of the event.</typeparam>
    public void Register <T>(CustomEvent.Handler handler) where T : CustomEvent
    {
        Type type = typeof(T);

        /*
         *
         * If there's already an event of that type, add this handler to the list of handlers for that event.
         *
         * If not, add that event to the dictionary, with this handler as the first item in the list.
         *
         * Note that there's no explicit list, because in C# delegates are both references to a function and a list
         * of functions.
         *
         */
        if (registeredHandlers.ContainsKey(type))
        {
            registeredHandlers[type] += handler;
        }
        else
        {
            registeredHandlers[type] = handler;
        }
    }