private final transient Map<String, Set<Type>> outputTypes;
private Map<String, Set<Schema>> inputs;
private Map<String, Set<Schema>> outputs;
FlowletDefinition(String flowletName, Flowlet flowlet, int instances) {
FlowletSpecification flowletSpec = flowlet.configure();
this.instances = instances;
Map<String, Set<Type>> inputTypes = Maps.newHashMap();
Map<String, Set<Type>> outputTypes = Maps.newHashMap();
Map<String, String> properties = Maps.newHashMap(flowletSpec.getProperties());
Reflections.visit(flowlet, TypeToken.of(flowlet.getClass()),
new PropertyFieldExtractor(properties),
new OutputEmitterFieldExtractor(outputTypes),
new ProcessMethodExtractor(inputTypes));
this.inputTypes = immutableCopyOf(inputTypes);
this.outputTypes = immutableCopyOf(outputTypes);
this.flowletSpec = new DefaultFlowletSpecification(flowlet.getClass().getName(),
flowletName == null ? flowletSpec.getName() : flowletName,
flowletSpec.getDescription(), flowletSpec.getFailurePolicy(),
properties, flowletSpec.getResources(),
flowletSpec.getMaxInstances());
}