if(curModuleInstance.withinUniverse(universe) ){
Map<Input, InstanceInput> nextUniverse = new LinkedHashMap<Input, InstanceInput>(universe);
nextUniverse.putAll(curModuleInstance.universe());
InstanceOutput refInstanceOutput= curModuleInstance.output(curMultiRefInput.reference().name());
Object nextValue = refInstanceOutput.value();
if(!curMultiRefInput.multiValue()){
nextUniverse = new LinkedHashMap<Input, InstanceInput>(nextUniverse);
if(!coupledInputs){
nextUniverse.put(originInput, new InstanceInput(this, originInput, nextValue, refInstanceOutput));
} else {
for(String ciName : coupledInputsFor(originInput.name())){
// we are only coupling multi inputs
if(!(input(ciName) instanceof MultiInput))
throw new IllegalStateException(" can't couple non multiple inputs");
MultiInput coupledMi = (MultiInput) input(ciName);
if(coupledMi.inputs().size() != ((MultiInput)originInput).inputs().size())
throw new IllegalStateException("These multiple inputs have different length and can't be coupled");
// Raw inputs can only be coupled with another reference input
if(!(coupledMi.inputs().get(idx) instanceof ReferenceInput))
throw new IllegalStateException(" Reference can only be paired with another reference ");
ReferenceInput ri = (ReferenceInput) coupledMi.inputs().get(idx);
if(!(ri.reference().module().equals(curMultiRefInput.reference().module())))
throw new IllegalStateException(" Reference can only be paired with another reference from the same module");
// We are selecting next avlue from the same module instance
InstanceOutput refIO = curModuleInstance.output(ri.reference().name());
nextValue = refIO.value();
//System.out.println("Assigning "+ri.reference().module().name()+"."+ri.reference().name()+" into "+name()+"."+coupledMi.name());
nextUniverse.put(coupledMi, new InstanceInput(this, coupledMi, nextValue, refIO));
}
}