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;
    };
}