// ======================================================================================
    // PRIVATE MEMBERS - SUBSYSTEM EVENT STARTERS
    // ======================================================================================
    private void StartAttack()
    {
        m_attackDirection = new Vector2(m_input.GetHorizontal(), 0);

        if (m_attackDirection.sqrMagnitude == 0)
        {
            m_attackDirection = new Vector2(0, m_input.GetVertical());
            if (m_attackDirection.sqrMagnitude == 0)
            {
                m_attackDirection = new Vector2(m_control.ForwardDir == PlayerController.eDirection.Right ? 1 : -1, 0);
            }
            else
            {
                m_attackDirection.Normalize();
            }
        }
        else
        {
            m_attackDirection.Normalize();
        }

        if (!m_control.IsWallSnapped && !m_control.IsWallSliding)
        {
            IsAttacking = true;

            switch (EquipWeap)
            {
            case eWeapon.Fists:
            {
                StartCoroutine(PunchAttack());
                break;
            }

            case eWeapon.Saber:
            {
                StartCoroutine(SaberAttack());
                break;
            }

            case eWeapon.Pistol:
            {
                StartCoroutine(PistolAttack());
                break;
            }
            }
        }
    }
    // ======================================================================================
    // PRIVATE MEMBERS - SUBSYSTEM HANDLERS
    // ======================================================================================
    private void UpdateDashSubsystem()
    {
        if (IsDashing)
        {
            UpdateDash();
            return;
        }

        // GET INPUT
        bool doDash = m_input.GetDash() || (m_input.GetVertical() < -.5f && m_input.GetJump());

        m_inAirDashPermission = IsGrounded || m_inAirDashPermission;
        // Try to Trigger Event, if possible
        if (doDash && !IsEjecting && m_inAirDashPermission)
        {
            StartDash();
        }
    }