//TODO Melhorar reutilizacao de codigo usando pattern Template - note que a funcao aplica limites é idêntica para o limite máximo e o mínimo

        internal override IEnumerable <IRemuneracao> LimitaRemuneracoesDoContexto(IEnumerable <IRemuneracao> remuneracoesPorContextoDeAcumulacao)
        {
            IEnumerable <IRemuneracao> remuneracoesLimitadasNoContexto = null;
            Dinheiro totalDaRemuneracao = new Dinheiro();

            totalDaRemuneracao = remuneracoesPorContextoDeAcumulacao.Select(rem => rem is IRemuneracaoLimitada ? rem.ValorBruto : rem.ValorAjustado).SomaDinheiro();

            Dinheiro valorJaExcedido = ObtemTotalExcedidoDesteLimite(remuneracoesPorContextoDeAcumulacao);

            Dinheiro valorExcedente = Dinheiro.MenorEntre(_valorLimite, totalDaRemuneracao);
            IEnumerable <IRemuneracao> remuneracoesDisponiveisParaAbatimento = remuneracoesPorContextoDeAcumulacao.Where(rem => !rem.FoiEmitida && (!rem.FoiFechada || _podeAbaterFechadas));

            remuneracoesLimitadasNoContexto = FormaDeAbatimento.AbaterValorExcedenteDasRemuneracoes(this, remuneracoesDisponiveisParaAbatimento, valorExcedente);

            return(remuneracoesLimitadasNoContexto);
        }