<section xmlns="http://docbook.org/ns/docbook"
        xmlns:xlink="http://www.w3.org/1999/xlink"
        xmlns:xi="http://www.w3.org/2001/XInclude"
        version="5.0"
        xml:id="sec-replace-modules">

<title>Replace Modules</title>

<para>Modules that are imported can also be disabled.  The option
  declarations and config implementation of a disabled module will be
  ignored, allowing another to take it's place.  This can be used to
  import a set of modules from another channel while keeping the rest
  of the system on a stable release.</para>
<para><literal>disabledModules</literal> is a top level attribute like
  <literal>imports</literal>, <literal>options</literal> and
  <literal>config</literal>.  It contains a list of modules that will
  be disabled. This can either be the full path to the module or a
  string with the filename relative to the modules path
  (eg. &lt;nixpkgs/nixos/modules&gt; for nixos).
  </para>

<para>This example will replace the existing postgresql module with
  the version defined in the nixos-unstable channel while keeping the
  rest of the modules and packages from the original nixos channel.
  This only overrides the module definition, this won't use postgresql
  from nixos-unstable unless explicitly configured to do so.</para>

<programlisting>
{ config, lib, pkgs, ... }:

{
  disabledModules = [ "services/databases/postgresql.nix" ];

  imports =
    [ # Use postgresql service from nixos-unstable channel.
      # sudo nix-channel --add http://nixos.org/channels/nixos-unstable nixos-unstable
      &lt;nixos-unstable/nixos/modules/services/databases/postgresql.nix&gt;
    ];

  services.postgresql.enable = true;
}
</programlisting>

<para>This example shows how to define a custom module as a
  replacement for an existing module. Importing this module will
  disable the original module without having to know it's
  implementation details.</para>

<programlisting>
{ config, lib, pkgs, ... }:

with lib;

let
  cfg = config.programs.man;
in

{
  disabledModules = [ "services/programs/man.nix" ];

  options = {
    programs.man.enable = mkOption {
      type = types.bool;
      default = true;
      description = "Whether to enable manual pages.";
    };
  };

  config = mkIf cfg.enabled {
    warnings = [ "disabled manpages for production deployments." ];
  };
}
</programlisting>

</section>
