anchor.diff:    #          flags = { flagName = true/ false for each attribute in flagDescr
     #                     ... }
              
  -  chosenOptions = flagDescr : args : flags : 
  +  # optionals is a list of dependency names. If passed as attribute in args they'll be automatically added
  +  # to flags and flagDescr ( optionalName = { buildInputs = optionalName } )
  +  chooseOptionsByFlags = flagDescr : optionals : args :
  +    let givenOptionals = listToAttrs 
  +        (mapIf ( a : (__hasAttr a args) ) 
  +               ( x: av x { buildInputs = x; } ) 
  +               optionals );
  +        fd = flagDescr // givenOptionals;
  +    in chooseOptionsByFlags2 fd args ( getAttr ["flags"] [] args ++ (__attrNames givenOptionals ) );
  +
  +  chooseOptionsByFlags2 = flagDescr : args : flags : 
       let   
           # helper function
           collectFlags = state : flags :
  
positive.code:     #    alternativeAddOn  = { cfgOption = "--enable-add-ons-alt"; blocks = ["addOns", "addOns2"]; };
      #    justAOption =  { };
      #  };
      #  co = chosenOptions flagDescr args args.flags;
  
      #in args.stdenv.mkDerivation {
  
  
negative.code:     if list == []
      then nul
      else op (head list) (fold op nul (tail list));
      
    # Concatenate a list of lists.
    concatLists =
  