private BeanDeploymentArchiveImpl createBeanDeploymentArchive(
      final Index index,
      BeanArchiveMetadata beanArchiveMetadata,
      Module module,
      String beanArchivePrefix)
      throws DeploymentUnitProcessingException {

    Set<String> classNames = new HashSet<String>();
    // index may be null if a war has a beans.xml but no WEB-INF/classes
    if (index != null) {
      for (ClassInfo classInfo : index.getKnownClasses()) {
        classNames.add(classInfo.name().toString());
      }
    }
    return new BeanDeploymentArchiveImpl(
        classNames,
        beanArchiveMetadata.getBeansXml(),
        module,
        beanArchivePrefix + beanArchiveMetadata.getResourceRoot().getRoot().getPathName());
  }
  @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));
  }