{ config, pkgs, ... }: with import <stockholm/lib>; let
  cfg = config.lass.klem;
in {
  options.lass.klem = mkOption {
    default = {};
    type = types.attrsOf (types.submodule ({ config, ...}: {
      options = {
        target = mkOption {
          default = ".*";
          description = ''
            regex of valid targets
            can be shown with xclip -selection clipboard -t TARGETS
            the first hit is taken as target argument
          '';
          type = types.str;
        };
        script = mkOption {
          description = ''
            file to run if entry is selected
          '';
          type = types.path;
        };
        label = mkOption {
          default = config._module.args.name;
          description = ''
            label to show in dmenu for this script
          '';
          type = types.str;
        };
      };
    }));
  };
  config = let
    klem = pkgs.writers.writeDashBin "klem" ''
      set -x

      labels=""
      # match filetype against patterns
      ${concatMapStringsSep "\n" (script: ''
        ${pkgs.xclip}/bin/xclip -selection clipboard -target TARGETS -out \
          | grep -q '${script.target}'
        if [ $? -eq 0 ]; then
          labels="$labels:${script.label}"
        fi
      '') (attrValues cfg)}

      #remove empty line, feed into dmenu
      script=$(echo "$labels" \
        | ${pkgs.gnused}/bin/sed 's/^://;s/:/\n/g' \
        | ${pkgs.dmenu}/bin/dmenu)

      #run the chosen script
      case $script in
        ${concatMapStringsSep "\n" (script: indent ''
          ${script.label})
            target=$(${pkgs.xclip}/bin/xclip -selection clipboard -target TARGETS -out \
              | ${pkgs.gnugrep}/bin/grep '${script.target}' \
              | ${pkgs.gnugrep}/bin/grep -v TARGETS \
              | ${pkgs.coreutils}/bin/head -1)
            ${pkgs.xclip}/bin/xclip -selection clipboard -target "$target" -out \
            | ${script.script} \
            | ${pkgs.xclip}/bin/xclip -selection clipboard -in
          ;;
        '') (attrValues cfg)}
      esac
    '';
  in mkIf (cfg != {}) {
    environment.systemPackages = [ klem ];
    nixpkgs.overlays = [
      (self: super: {
        klem = klem;
      })
    ];
  };
}
