I've just spiked a solution:
Add this to PicoContainer and DefaultPicoContainer (etc)
public MutablePicoContainer makeChildContainer(Object[] constituentParts) {
DefaultPicoContainer transient1 = new DefaultPicoContainer();
MutablePicoContainer transient2 = transient1.makeChildContainer();
for (int i = 0; i < constituentParts.length; i++) {
Object constituentPart = constituentParts[i];
if (constituentPart instanceof Class) {
Class clazz = (Class) constituentPart;
if (MutablePicoContainer.class.isAssignableFrom(clazz)) {
transient2.registerComponentImplementation(MutablePicoContainer.class, clazz);
} else if (ComponentAdapterFactory.class.isAssignableFrom(clazz)) {
transient2.registerComponentImplementation(ComponentAdapterFactory.class, clazz);
} else if(LifecycleManager.class.isAssignableFrom(clazz)) {
transient2.registerComponentImplementation(LifecycleManager.class, clazz);
} else {
transient2.registerComponentImplementation(clazz);
}
} else {
if (constituentPart instanceof ComponentAdapterFactory) {
transient2.registerComponentInstance(ComponentAdapterFactory.class, constituentPart);
} else if(constituentPart instanceof LifecycleManager) {
transient2.registerComponentInstance(LifecycleManager.class, constituentPart);
} else {
transient2.registerComponentInstance(constituentPart);
}
}
}
transient1.registerComponentInstance(PicoContainer.class, this); // parent
// fallbacks
transient1.registerComponentInstance(ComponentAdapterFactory.class, componentAdapterFactory);
transient1.registerComponentInstance(LifecycleManager.class, lifecycleManager);
return (MutablePicoContainer) transient2.getComponentInstance(MutablePicoContainer.class);
}
and this method to DPCTestCase :-
public void testComplexMakeChildContainer() {
DefaultPicoContainer pc1 = new DefaultPicoContainer();
ComponentAdapterFactory caf = new ComponentAdapterFactory() {
public ComponentAdapter createComponentAdapter(Object componentKey,
Class componentImplementation,
Parameter[] parameters) throws PicoIntrospectionException, AssignabilityRegistrationException, NotConcreteRegistrationException {
return new ComponentAdapter() {
public Object getComponentKey() {
return String.class;
}
public Class getComponentImplementation() { return String.class; } }
public Object getComponentInstance(PicoContainer container) throws PicoInitializationException, PicoIntrospectionException {
return "foo";
}
public void verify(PicoContainer container) throws PicoIntrospectionException {
}
public void accept(PicoVisitor visitor) {
}
};
}
};
MutablePicoContainer pc2 = pc1.makeChildContainer(new Object[] {caf, ImplementationHidingPicoContainer.class});
pc2.registerComponentImplementation(String.class);
String foo = (String) pc2.getComponentInstanceOfType(String.class);
assertTrue(pc2 instanceof ImplementationHidingPicoContainer);
assertEquals("foo", foo);
}
patch by mark hobson