package com.softwaremill.common.cdi.autofactory.extension; import com.softwaremill.common.cdi.autofactory.CreatedWith; import javax.enterprise.event.Observes; import javax.enterprise.inject.spi.*; import java.util.HashSet; import java.util.Set; /** * @author Adam Warski (adam at warski dot org) */ public class AutoFactoryExtension implements Extension { private Set<Bean> factoryBeansToAdd = new HashSet<Bean>(); public <X> void processAnnotatedType(@Observes ProcessAnnotatedType<X> event, BeanManager beanManager) { CreatedWith createdWithAnnotation = event.getAnnotatedType().getAnnotation(CreatedWith.class); if (createdWithAnnotation != null) { factoryBeansToAdd.add(new AutoFactoryFromCreatedWithCreator<X>(beanManager, createdWithAnnotation, event) .create()); // This class shouldn't be treated normally, as it contains a constructor with @Inject, where // not all of the arguments can be injected from the bean manager. event.veto(); } } public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd) { for (Bean bean : factoryBeansToAdd) { abd.addBean(bean); } } }