public Directory buildDelegatingLdapDirectory(
      DelegatingLdapDirectoryConfiguration configuration) {
    ImmutableDirectory.Builder builder = createBuilder();
    builder.setAllowedOperations(EnumSet.allOf(OperationType.class));
    builder.setActive(configuration.isActive());
    builder.setId(configuration.getDirectoryId());
    builder.setImplementationClass(DelegatedAuthenticationDirectory.class.getName());
    builder.setName(configuration.getName());
    builder.setType(DirectoryType.DELEGATING);

    LdapDelegatingDirectoryAttributes attributes = new LdapDelegatingDirectoryAttributes();
    BeanUtils.copyProperties(
        configuration, attributes); // ignores attributes that don't exist in the target - perfect!
    attributes.setDelegatedToClass(configuration.getType());
    if (configuration.isCreateUserOnAuth()) {
      attributes.setUpdateUserOnAuth(true); // create-on-auth implies update-on-auth
      attributes.setLdapAutoAddGroups(
          commaWhitespaceSeparatedGroupsToPipeSeparatedGroups(
              configuration.getLdapAutoAddGroups()));
    } else {
      attributes.setLdapAutoAddGroups("");
    }
    builder.setAttributes(attributes.toAttributesMap());

    return builder.toDirectory();
  }