anchor.diff:      if all isAttrs opts then
         lib.zip (attr: opts:
           let
  +          recurseInto = name: attrs:
  +            handleOptionSets optionHandler name attrs;
  +
             # Compute the path to reach the attribute.
             name = if path == "" then attr else path + "." + attr;
   
  
positive.code: rec {
  
  
    mkOption = attrs: attrs // {_type = "option";};
  
    hasType = x: isAttrs x && x ? _type;
    typeOf = x: if hasType x then x._type else "";
  
    isOption = attrs: (typeOf attrs) == "option";
  
    addDefaultOptionValues = defs: opts: opts //
      builtins.listToAttrs (map (defName:
        { name = defName;
  
negative.code:           # Remove undefined values that are coming from evalIf.
            optValues = evalProperties defs;
          in
            if decls == [] then recurseInto name optAttrs
            else lib.addErrorContext "while evaluating the option ${name}:" (
              export opt optValues
            )
        ) opts
     else lib.addErrorContext "while evaluating ${path}:" (notHandle opts);
  