rec {
  /*
    Given the attrset for evaluating a wrapper-manager module, return a
    derivation containing the wrapper.
  */
  build = args: (eval args).config.build.toplevel;

  # Evaluate a wrapper-manager configuration.
  eval =
    {
      pkgs,
      lib ? pkgs.lib,
      modules ? [ ],
      specialArgs ? { },
    }:
    lib.evalModules {
      inherit specialArgs;
      modules = [
        ../modules/wrapper-manager

        # Setting pkgs modularly. This would make setting up wrapper-manager
        # with different nixpkgs instances possible but it isn't something that
        # is explicitly supported.
        (
          { lib, ... }:
          {
            config._module.args.pkgs = lib.mkDefault pkgs;
          }
        )
      ] ++ modules;
    };
}