/// <inheritdoc />
        public void AddHandler <T>(IAciEventHandler <T> handler) where T : struct
        {
            Type     eventArgType  = typeof(T);
            Delegate eventInstance = null;

            if (!registry.TryGetValue(eventArgType, out eventInstance))
            {
                registry[eventArgType] = new EventDelegate <T>(handler.OnEvent);
                return;
            }
            EventDelegate <T> del = eventInstance as EventDelegate <T>;

            del += handler.OnEvent;
            registry[eventArgType] = del;
        }
        /// <inheritdoc />
        public void RemoveHandler <T>(IAciEventHandler <T> handler) where T : struct
        {
            Type     eventArgType  = typeof(T);
            Delegate eventInstance = null;

            if (!registry.TryGetValue(eventArgType, out eventInstance))
            {
                // we don't have a valid event instance
                return;
            }
            EventDelegate <T> del = eventInstance as EventDelegate <T>;

            del -= handler.OnEvent;
            registry[eventArgType] = del;
            // if we don't have any subscribers remove event handler
            if (del != null)
            {
                return;
            }
            registry.Remove(eventArgType);
        }