package br.com.caelum.iogi.collections; import java.util.List; import br.com.caelum.iogi.Instantiator; import br.com.caelum.iogi.parameters.Parameter; import br.com.caelum.iogi.parameters.Parameters; import br.com.caelum.iogi.reflection.Target; public class ListInstantiator implements Instantiator<List<Object>> { private final Instantiator<Object> listElementInstantiator; public ListInstantiator(final Instantiator<Object> listElementInstantiator) { this.listElementInstantiator = listElementInstantiator; } public boolean isAbleToInstantiate(final Target<?> target) { return target.getClassType().isAssignableFrom(List.class); } public List<Object> instantiate(final Target<?> target, final Parameters parameters) { final List<Parameter> relevantParameters = parameters.forTarget(target); if (hasNoRelevantParameters(relevantParameters) || firstParameterIsDecorated(relevantParameters)) return new IndexedListInstantiator(listElementInstantiator).instantiate(target, parameters); else return new CyclingListInstantiator(listElementInstantiator).instantiate(target, parameters); } private boolean firstParameterIsDecorated(final List<Parameter> relevantParameters) { return relevantParameters.get(0).isDecorated(); } private boolean hasNoRelevantParameters(final List<Parameter> relevantParameters) { return relevantParameters.isEmpty(); } }