args:
let 
	defList = [
(assert false) - correct it; List element is of form ["name" default]
	];
	#stdenv and fetchurl are added automatically
	getVal = (args.lib.getValue args defList);
	check = args.lib.checkFlag args;
	reqsList = [
(assert false) - correct it; List element is of form ["name" "requirement-name" ... ]
		["true"]
		["false"]
	];
	buildInputsNames = args.lib.filter (x: (null!=getVal x)) 
		(args.lib.uniqList {inputList = 
		(args.lib.concatLists (map 
		(x:(if (x==[]) then [] else builtins.tail x)) 
		reqsList));});
	configFlags = [
		"true" ""
(assert false) - fill it; list consists of pairs "condition" "flags". "True" means always.
	];
	nameSuffixes = [
(assert false) - fill it if needed, or blank it.
	];
in
	assert args.lib.checkReqs args defList reqsList;
with args; 
args.stdenv.mkDerivation {
  name = args.lib.condConcat "
#Fill the name //
" nameSuffixes check;
 
  src = args.
#Put fetcher here 
 
  buildInputs = args.lib.filter (x: x!=null) (map getVal buildInputsNames);
  configureFlags = args.lib.condConcat "" configFlags check;

  meta = {
    description = "
#Fill description here
";
  };
}