private ArrayList<DimensionValuePair> handle(ArrayList<DimensionValuePair> currentTargetStateSet, ArrayList<DimensionIterator> leftIterators,
            DimensionIterator iterator, IConstraint constraint) {
        final ArrayList<DimensionValuePair> copyToLoadNextValueOfCurrentDimensionValue = new ArrayList<DimensionValuePair>(currentTargetStateSet);
        currentTargetStateSet.add(new DimensionValuePair(iterator.getDimension(), iterator.getValue()));
        final String[] currentChoices = new String[currentTargetStateSet.size()];
        for ( int i = 0; i < currentChoices.length; i++ ) {
            currentChoices[i] = currentTargetStateSet.get(i).getChoice();
        }
        if ( null != constraint && constraint.skip(currentTargetStateSet.size(), currentChoices) ) {
            return copyToLoadNextValueOfCurrentDimensionValue;
        }
        // challenge include and exclude constrains:
        // For exclude constraints, challenge happens iterator reaches the last
        // dimension defined in exclude constraint
        // For include constraints, challenge happens iterator reaches every
        // dimension defined in include constraint with combination.
        if ( 0 >= leftIterators.size() ) {
            // targetStateSetList.add(currentTargetStateSet);
            try {
                callback.onCombinationFound(new DynamicCaseContext(new ArrayList<DimensionValuePair>(currentTargetStateSet)));
            } catch (Throwable ignored) {
            }
        } else {
            generateAllLeft(currentTargetStateSet, leftIterators, constraint);
        }
        return copyToLoadNextValueOfCurrentDimensionValue;
    }