@SuppressWarnings({"unchecked", "rawtypes"})
  private <T extends IdentityStore> T createIdentityStore(
      IdentityStoreConfiguration storeConfiguration) {
    Class<T> storeClass = (Class<T>) storeConfiguration.getIdentityStoreType();

    if (storeClass == null) {
      // If no store class is configured, default to the built-in types for known configurations
      if (FileIdentityStoreConfiguration.class.isInstance(storeConfiguration)) {
        storeClass = (Class<T>) FileIdentityStore.class;
      } else if (JPAIdentityStoreConfiguration.class.isInstance(storeConfiguration)) {
        storeClass = (Class<T>) JPAIdentityStore.class;
      } else if (LDAPIdentityStoreConfiguration.class.isInstance(storeConfiguration)) {
        storeClass = (Class<T>) LDAPIdentityStore.class;
      } else if (JDBCIdentityStoreConfiguration.class.isInstance(storeConfiguration)) {
        storeClass = (Class<T>) JDBCIdentityStore.class;
      }
    }

    if (storeClass == null) {
      throw MESSAGES.configUnknownStoreForConfiguration(storeConfiguration);
    }

    try {
      if (storeConfiguration instanceof AbstractIdentityStoreConfiguration) {
        ((AbstractIdentityStoreConfiguration) storeConfiguration).setIdentityStoreType(storeClass);
      }

      T store = storeClass.newInstance();

      store.setup(storeConfiguration);

      return store;
    } catch (Exception ex) {
      throw MESSAGES.configCouldNotCreateStore(storeClass, storeConfiguration, ex);
    }
  }