private void collectDataProviders(int dataProviderOffset, DataVariableMultiplicationFactor factor,
                                      List<DataProviderInfo> factorProviderInfos, List<Object> factorProviders) {
      List<DataProviderInfo> dataProviderInfos = context.getCurrentFeature().getDataProviders();
      int factorDataVariables = factor.getDataVariables().length;
      int remainingDataVariables = factorDataVariables;
      while (remainingDataVariables > 0) {
        int dataProviderIndex = dataProviderOffset + factorDataVariables - remainingDataVariables;
        DataProviderInfo dataProviderInfo = dataProviderInfos.get(dataProviderIndex);
        factorProviderInfos.add(dataProviderInfo);
        factorProviders.add(dataProviders[dataProviderIndex]);
        remainingDataVariables -= dataProviderInfo.getDataVariables().size();
      }
      Assert.that(remainingDataVariables == 0);
    }
Creates a multiplier that is backed by data providers and on-the-fly multiplies them as they are processed.

@param dataVariableMultiplication the multiplication for which to create the multiplier
@param dataProviderOffset the index of the first data provider for the given multiplication
@return the data provider multiplier
spock-core/src/main/java/org/spockframework/runtime/DataIteratorFactory.java