anchor.diff:    # function "merge" which expects two arguments.  The attribute named
     # "require" is used to imports option declarations and bindings.
     fixOptionSetsFun = merge: pkgs: opts:
  -    let optionSet = config: configFun:
  -      if __isFunction configFun then
  -        let result = configFun { inherit pkgs config; }; in
  -      # {pkgs, config, ...}: {..}
  -        if builtins.isAttrs result then result
  -      # pkgs: config: {..}
  -        else configFun pkgs config
  -      # {..}
  -      else configFun;
  +    let
  +      # ignore all conditions that are on require attributes.
  +      rmRequireIf = conf:
  +        let conf2 = delayIf conf; in
  +        if conf2 ? require then
  +          conf2 // { require = rmIf conf2.require; }
  +        else
  +          conf2;
  +
  +      # call configuration "files" with one of the existing convention.
  +      optionSet = config: configFun:
  +        if __isFunction configFun then
  +          let result = configFun { inherit pkgs config; }; in
  +        # {pkgs, config, ...}: {..}
  +          if builtins.isAttrs result then result
  +        # pkgs: config: {..}
  +          else configFun pkgs config
  +        # {..}
  +        else configFun;
  +
  +      processConfig = config: configFun:
  +        rmRequireIf (optionSet config configFun);
       in
  -      config: merge ""
  -        (map (x: removeAttrs x ["require"])
  -          (uniqFlattenAttr (optionSet config) "require" [] (toList opts))
  -        );
  +      config: merge "" (
  +        uniqFlattenAttr (processConfig) "require" [] (toList opts)
  +      );
   
     fixOptionSets = merge: pkgs: opts:
       fix (fixOptionSetsFun merge pkgs opts);
  
positive.code:   uniqFlattenAttr = f: attr: default: x:
      if x == []
      then default
      else let h = f (head x); t = tail x; in
        if elem h default
        then uniqFlattenAttr f attr default t
        else uniqFlattenAttr f attr (default ++ [h]) (toList (getAttr [attr] [] h) ++ t)
      ;
  
    /* Options. */
  
  
negative.code:           test = partition isOption opts;
            opt = ({ merge = mergeDefaultOption; apply = id; } // head test.right);
          in
            if test.right == [] then mergeOptionSets noOption name (map delayIf test.wrong)
            else if tail test.right != [] then throw "Multiple options for '${name}'."
            else if test.wrong == [] then opt.apply opt.default
            else opt.apply (opt.merge name (map evalIf test.wrong))
        ) opts
     else noOption path opts;
  
  