private static DashCollision CreateDashCollisionHook(DashCollision orig, DashCollisionHook init = null)
        {
            orig ??= DashCollisionDefault;
            var           hooks   = new List <DashCollisionHook>();
            DashCollision handler = (Player player, Vector2 direction) => {
                int i = 0;
                DashCollisionResults Trampoline(DashCollision orig, Player player, Vector2 direction)
                {
                    if (hooks.Count <= i)
                    {
                        return(orig(player, direction));
                    }
                    DashCollisionHook current = hooks[i++];

                    return(Trampoline((Player player, Vector2 direction) => current.Invoke(orig, player, direction), player, direction));
                }

                return(Trampoline(orig, player, direction));
            };

            DynamicData.For(handler).Add(DASHCOLLISIONHOOK_TAG, hooks);
            if (init is not null)
            {
                hooks.Add(init);
            }
            return(handler);
        }
        /// <returns>Handler to be assigned to Platform.OnDashCollide</returns>
        public static DashCollision ApplyDashCollisionHook(DashCollision orig, DashCollisionHook hook)
        {
            if (hook is null)
            {
                throw new ArgumentNullException("hook");
            }

            if (orig is not null && DynamicData.For(orig).TryGet(DASHCOLLISIONHOOK_TAG, out List <DashCollisionHook> hooks))
            {
                hooks.Add(hook);
                return(orig);
            }