package bvira.util; import org.picocontainer.DefaultPicoContainer; import org.picocontainer.MutablePicoContainer; import org.picocontainer.containers.TransientPicoContainer; public class DefaultContainer implements Container { final MutablePicoContainer picoContainer; public DefaultContainer() { picoContainer = new DefaultPicoContainer(); } public DefaultContainer(DefaultContainer parent) { picoContainer = new TransientPicoContainer(parent.picoContainer); } public <T> T getInstance(Class<T> aClass) { T instance = picoContainer.getComponent(aClass); if (instance == null) { throw new IllegalArgumentException("Cannot find instance of " + aClass); } return instance; } public Container register(Class<?>... classes) { for (Class<?> clazz : classes) { picoContainer.addComponent(clazz); } return this; } public Container register(Object... objects) { for (Object o : objects) { remove(o.getClass()); picoContainer.addComponent(o); } return this; } private void remove(Class<?> clazz) { for (Class type : clazz.getInterfaces()) { picoContainer.removeComponent(type); } picoContainer.removeComponent(clazz); } public void dispose() { picoContainer.dispose(); } public <T> boolean containsInstance(Class<T> classInstance) { try { getInstance(classInstance); return true; } catch (IllegalArgumentException e) { return false; } } public Container transientContainer() { return new DefaultContainer(this); } }