package org.testory.plumbing.inject;
import static java.lang.String.format;
import static java.util.Arrays.asList;
import static org.testory.plumbing.PlumbingException.check;
import java.util.ArrayList;
import java.util.List;
import org.testory.plumbing.Maker;
public class ChainedMaker implements Maker {
private final List<Maker> makersList;
private ChainedMaker(List<Maker> makersList) {
this.makersList = makersList;
}
public static Maker chain(Maker... makers) {
check(makers != null);
List<Maker> makersList = new ArrayList<>(asList(makers));
check(!makersList.contains(null));
return new ChainedMaker(makersList);
}
public <T> T make(Class<T> type, String name) {
check(type != null);
check(name != null);
for (Maker maker : makersList) {
try {
return maker.make(type, name);
} catch (RuntimeException e) {}
}
throw new RuntimeException(format("cannot make %s of type %s", name, type.getName()));
}
}