{ callPackage }:

rec {
  buildMod = callPackage ./builder.nix {
    type = "mod";
  };

  buildSoundPack = callPackage ./builder.nix {
    type = "soundpack";
  };

  buildTileSet = callPackage ./builder.nix {
    type = "tileset";
  };

  wrapCDDA = callPackage ./wrapper.nix {};

  # Required to fix `pkgs` and `withMods` attrs after applying `overrideAttrs`.
  #
  # Example:
  #     let
  #       myBuild = cataclysmDDA.jenkins.latest.tiles.overrideAttrs (_: {
  #         x = "hello";
  #       });
  #
  #       # This refers to the derivation before overriding! So, `badExample.x` is not accessible.
  #       badExample = myBuild.withMods (_: []);
  #
  #       # `myBuild` is correctly referred by `withMods` and `goodExample.x` is accessible.
  #       goodExample = let
  #         inherit (cataclysmDDA) attachPkgs pkgs;
  #       in
  #       (attachPkgs pkgs myBuild).withMods (_: []);
  #     in
  #     goodExample.x  # returns "hello"
  attachPkgs = pkgs: super:
  let
    self = super.overrideAttrs (old: {
      passthru = old.passthru // {
        pkgs = pkgs.override { build = self; };
        withMods = wrapCDDA self;
      };
    });
  in
  self;
}