/// <summary>
        /// Returns a rounded period value
        /// </summary>
        /// <param name="specificValueType"></param>
        /// <param name="period"></param>
        /// <returns></returns>
        public decimal GetPeriodTaxYearValue(TaxYearSpecificValues specificValueType, PayPeriods period)
        {
            // Get the annual value
            decimal annualValue = GetSpecificValue <decimal>(specificValueType);

            // By default for weekly we have 52 weeks in our period
            int periodCnt     = 52;
            int weeksInPeriod = 1;

            if (period == PayPeriods.Monthly)
            {
                periodCnt = 12;
            }
            else
            {
                weeksInPeriod = (int)Math.Round((decimal)periodCnt / (int)period);
            }

            return(TaxMath.PeriodRound((annualValue * weeksInPeriod) / periodCnt, weeksInPeriod));
        }
        public T GetSpecificValue <T>(TaxYearSpecificValues specificValueType)
        {
            EnsureTaxYearSet();

            object retValue;

            switch (specificValueType)
            {
            case TaxYearSpecificValues.ApprenticeUpperSecondaryThreshold:
                retValue = CurrentTaxYear.ApprenticeUpperSecondaryThreshold;
                break;

            case TaxYearSpecificValues.DeaProtectedEarnings:
                retValue = CurrentTaxYear.DeaProtectedEarnings;
                break;

            case TaxYearSpecificValues.LowerEarningsLimit:
                retValue = CurrentTaxYear.LowerEarningsLimit;
                break;

            case TaxYearSpecificValues.UpperEarningsLimit:
                retValue = CurrentTaxYear.UpperEarningsLimit;
                break;

            case TaxYearSpecificValues.PrimaryThreshold:
                retValue = CurrentTaxYear.PrimaryThreshold;
                break;

            case TaxYearSpecificValues.SecondaryThreshold:
                retValue = CurrentTaxYear.SecondaryThreshold;
                break;

            case TaxYearSpecificValues.UpperAccrualPoint:
                retValue = CurrentTaxYear.UpperAccrualPoint;
                break;

            case TaxYearSpecificValues.UpperSecondaryThreshold:
                retValue = CurrentTaxYear.UpperSecondaryThreshold;
                break;

            case TaxYearSpecificValues.Plan1StudentLoanThreshold:
                retValue = CurrentTaxYear.Plan1StudentLoanThreshold;
                break;

            case TaxYearSpecificValues.Plan1StudentLoanRate:
                retValue = CurrentTaxYear.Plan1StudentLoanRate;
                break;

            case TaxYearSpecificValues.Plan2StudentLoanThreshold:
                retValue = CurrentTaxYear.Plan2StudentLoanThreshold;
                break;

            case TaxYearSpecificValues.Plan2StudentLoanRate:
                retValue = CurrentTaxYear.Plan2StudentLoanRate;
                break;

            case TaxYearSpecificValues.PensionLowerThreshold:
                retValue = CurrentTaxYear.PensionLowerThreshold;
                break;

            case TaxYearSpecificValues.PensionAutomaticEnrolment:
                retValue = CurrentTaxYear.PensionAutomaticEnrolment;
                break;

            case TaxYearSpecificValues.PensionUpperThreshold:
                retValue = CurrentTaxYear.PensionUpperThreshold;
                break;

            case TaxYearSpecificValues.DefaultTaxCode:
                retValue = CurrentTaxYear.DefaultTaxCode;
                break;

            default:
                throw new NotImplementedException($"Could not provide a value for {specificValueType} using this provider. Ensure you are using the latest version.");
            }

            return((T)retValue);
        }