{ # The first few arguments are implicitly passed by the 'close' helper lib, pkgs, doctrine, name, config, hm ? null, sys ? null, options ? null, requires ? [], prefix ? doctrine.prefix, namespace ? doctrine.namespace, passthru ? {}, }: let patchArgs = args: args // passthru // {inherit cfg name doctrine;}; optionsSet = args: import options (patchArgs args); configSet = args: import configFiles.${namespace} (patchArgs args); configFiles = lib.filterAttrs (k: v: v != null) { inherit sys hm; }; cfg = config.${prefix}.${name}; hasConfig = configFiles ? ${namespace}; in { imports = [ (args @ { config, modulesPath ? null, lib, pkgs, ... }: lib.optionalAttrs hasConfig { config = lib.mkIf cfg.enable (lib.mkMerge [ (configSet args) { assertions = map (dependency: { assertion = cfg.enable -> config.${prefix}.${dependency}.enable; message = "${prefix}.${name}.enable requires ${prefix}.${dependency}.enable"; }) requires; } ]); }) (args @ { config, modulesPath ? null, lib, pkgs, ... }: let hasOptions = options != null && optionsForArgs ? ${namespace}; optionsForArgs = optionsSet args; in lib.optionalAttrs (hasOptions || hasConfig) { options.${prefix}.${name} = lib.optionalAttrs hasOptions optionsForArgs.${namespace} // { enable = lib.mkEnableOption name; }; }) ]; }