{ pkgs
, lib ? pkgs.lib
, modules ? []
, extraArgs ? {}
, specialArgs ? {}
, check ? true
, prefix ? []
}:
let extraArgs_  = extraArgs;
    pkgs_       = pkgs;
    baseModules = map import (lib.findFiles ".*\\.nix" ./modules );
    pkgsModule  = rec {
      _file  = ./modules.nix;
      key    = _file;
      config = {
        _module.args.pkgs = lib.mkIf (pkgs_ != null) (lib.mkForce pkgs_);
      };
    };
in
rec {
  # Merge the option definitions in all modules,
  # forming the full system configuration.
  inherit (lib.evalModules {
    inherit prefix;
    inherit check;
    modules = modules ++ baseModules ++ [ pkgsModule ];
    args    = extraArgs;
    inherit specialArgs;
    #specialArgs = { modulesPath = config/modules.nix; } // specialArgs;
  }) config options;

  # These are the extra arguments passed to every module.
  # In particular, Nixpkgs is passed through the "pkgs" argument.
  extraArgs = extraArgs_ // {
    inherit modules;
    inherit baseModules;
  };

  inherit (config._module.args) pkgs;
}