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