@Override
  public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {

    final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
    final DeploymentUnit topLevelDeployment =
        deploymentUnit.getParent() == null ? deploymentUnit : deploymentUnit.getParent();
    final ServiceTarget serviceTarget = phaseContext.getServiceTarget();
    if (!WeldDeploymentMarker.isPartOfWeldDeployment(topLevelDeployment)) {
      return;
    }

    final Collection<ServiceName> dependencies =
        deploymentUnit.getAttachment(Attachments.JNDI_DEPENDENCIES);

    BeanDeploymentArchiveImpl rootBda =
        deploymentUnit.getAttachment(WeldAttachments.DEPLOYMENT_ROOT_BEAN_DEPLOYMENT_ARCHIVE);
    if (rootBda == null) {
      // this archive is not actually a bean archive.
      // then use the top level root bda
      rootBda =
          topLevelDeployment.getAttachment(WeldAttachments.DEPLOYMENT_ROOT_BEAN_DEPLOYMENT_ARCHIVE);
    }
    if (rootBda == null) {
      WeldLogger.ROOT_LOGGER.couldNotFindBeanManagerForDeployment(deploymentUnit.getName());
      return;
    }

    final ServiceName weldServiceName =
        topLevelDeployment.getServiceName().append(WeldBootstrapService.SERVICE_NAME);

    // add the BeanManager service
    final ServiceName beanManagerServiceName = BeanManagerService.serviceName(deploymentUnit);
    BeanManagerService beanManagerService = new BeanManagerService(rootBda.getId());
    serviceTarget
        .addService(beanManagerServiceName, beanManagerService)
        .addDependency(
            weldServiceName, WeldBootstrapService.class, beanManagerService.getWeldContainer())
        .install();
    ;

    final EEModuleDescription moduleDescription =
        deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);

    if (moduleDescription == null) {
      return;
    }

    // hack to set up a java:comp binding for jar deployments as well as wars
    if (DeploymentTypeMarker.isType(DeploymentType.WAR, deploymentUnit)
        || deploymentUnit.getName().endsWith(".jar")) {
      // bind the bean manager to JNDI
      final ServiceName moduleContextServiceName =
          ContextNames.contextServiceNameOfModule(
              moduleDescription.getApplicationName(), moduleDescription.getModuleName());
      bindBeanManager(
          serviceTarget,
          beanManagerServiceName,
          moduleContextServiceName,
          dependencies,
          phaseContext.getServiceRegistry());
    }

    // bind the bm into java:comp for all components that require it
    for (ComponentDescription component : moduleDescription.getComponentDescriptions()) {
      if (component.getNamingMode() == ComponentNamingMode.CREATE) {
        final ServiceName compContextServiceName =
            ContextNames.contextServiceNameOfComponent(
                moduleDescription.getApplicationName(),
                moduleDescription.getModuleName(),
                component.getComponentName());
        bindBeanManager(
            serviceTarget,
            beanManagerServiceName,
            compContextServiceName,
            dependencies,
            phaseContext.getServiceRegistry());
      }
    }
    deploymentUnit.addToAttachmentList(Attachments.SETUP_ACTIONS, new WeldContextSetup());
  }
  @Override
  public void deploy(DeploymentPhaseContext phaseContext) throws DeploymentUnitProcessingException {
    final DeploymentUnit deploymentUnit = phaseContext.getDeploymentUnit();
    final DeploymentUnit topLevelDeployment =
        deploymentUnit.getParent() == null ? deploymentUnit : deploymentUnit.getParent();
    final WeldDeploymentMetadata cdiDeploymentMetadata =
        deploymentUnit.getAttachment(WeldDeploymentMetadata.ATTACHMENT_KEY);

    if (!WeldDeploymentMarker.isWeldDeployment(deploymentUnit)) {
      return;
    }

    // create a CDI injection factory
    EEModuleDescription eeModuleDescription =
        deploymentUnit.getAttachment(org.jboss.as.ee.component.Attachments.EE_MODULE_DESCRIPTION);
    final Module topLevelModule = topLevelDeployment.getAttachment(Attachments.MODULE);
    if (eeModuleDescription != null) {
      eeModuleDescription.addInjectionFactory(
          new WeldInjectionFactory(
              phaseContext.getServiceTarget(), deploymentUnit, topLevelModule.getClassLoader()));
    }
    final String beanArchiveIdPrefix;
    if (deploymentUnit.getParent() == null) {
      beanArchiveIdPrefix = deploymentUnit.getName();
    } else {
      beanArchiveIdPrefix = deploymentUnit.getParent().getName() + "." + deploymentUnit.getName();
    }

    final Set<BeanDeploymentArchiveImpl> beanDeploymentArchives =
        new HashSet<BeanDeploymentArchiveImpl>();
    log.info("Processing CDI deployment: " + phaseContext.getDeploymentUnit().getName());

    final Map<ResourceRoot, Index> indexes =
        AnnotationIndexUtils.getAnnotationIndexes(deploymentUnit);

    final Module module = phaseContext.getDeploymentUnit().getAttachment(Attachments.MODULE);
    boolean rootArchiveFound = false;
    if (cdiDeploymentMetadata != null) {
      // this can be null for ear deployments
      // however we still want to create a module level bean manager
      for (BeanArchiveMetadata beanArchiveMetadata :
          cdiDeploymentMetadata.getBeanArchiveMetadata()) {
        BeanDeploymentArchiveImpl bda =
            createBeanDeploymentArchive(
                indexes.get(beanArchiveMetadata.getResourceRoot()),
                beanArchiveMetadata,
                module,
                beanArchiveIdPrefix);
        beanDeploymentArchives.add(bda);
        if (beanArchiveMetadata.isDeploymentRoot()) {
          rootArchiveFound = true;
          deploymentUnit.putAttachment(
              WeldAttachments.DEPLOYMENT_ROOT_BEAN_DEPLOYMENT_ARCHIVE, bda);
        }
      }
    }
    if (!rootArchiveFound) {
      BeanDeploymentArchiveImpl bda =
          new BeanDeploymentArchiveImpl(
              Collections.<String>emptySet(),
              BeansXml.EMPTY_BEANS_XML,
              module,
              beanArchiveIdPrefix);
      beanDeploymentArchives.add(bda);
      deploymentUnit.putAttachment(WeldAttachments.DEPLOYMENT_ROOT_BEAN_DEPLOYMENT_ARCHIVE, bda);
    }

    deploymentUnit.putAttachment(
        WeldAttachments.BEAN_DEPLOYMENT_MODULE, new BeanDeploymentModule(beanDeploymentArchives));
  }