001    package org.picocontainer;
002    
003    import org.picocontainer.containers.ImmutablePicoContainer;
004    import org.picocontainer.containers.TransientPicoContainer;
005    import org.picocontainer.injectors.ConstructorInjection;
006    
007    import java.lang.reflect.Field;
008    import java.lang.reflect.Type;
009    
010    public class Emjection {
011    
012        private PicoContainer pico;
013    
014        public void setPico(ImmutablePicoContainer container) {
015            if (pico != null) {
016                throw new PicoCompositionException("Emjection can only be setup once per component");
017            }
018            pico = container;
019        }
020    
021        public static <T> T neu(Class<T> type, Emjection emjection, Object... args) {
022            if (emjection.pico == null) {
023                throw new PicoCompositionException("blah");
024            }
025            TransientPicoContainer tpc = new TransientPicoContainer(new ConstructorInjection(), emjection.pico);
026            for (Object arg : args) {
027                tpc.addComponent(arg);
028            }
029            T inst = tpc.getComponent(type);
030            if (inst == null) {
031                tpc.addComponent(type);
032                inst = tpc.getComponent(type);
033            }
034            setPico(inst, tpc);
035            return inst;
036        }
037    
038        private static <T> void setPico(Object inst, PicoContainer container) {
039            try {
040                Field field = inst.getClass().getDeclaredField("emjection");
041                field.setAccessible(true);
042                Emjection e2 = (Emjection) field.get(inst);
043                e2.setPico(new ImmutablePicoContainer(container));
044            } catch (NoSuchFieldException e) {
045                throw new PicoCompositionException("Components created via emjection have to have a field 'private Emjection emjection'. " + inst.getClass() + " is missing that field");
046            } catch (IllegalAccessException e) {
047                throw new PicoCompositionException("unable to access field called emjection on " + inst.getClass());
048            }
049        }
050    
051        public static void setupEmjection(Object inst, PicoContainer container) {
052                setPico(inst, container);
053        }
054    
055    
056    }