optFuWithDefaults =
Function[Null,
Module[
{fuToken, argsWrapped, nSlots},
nSlots = #3;
argsWrapped = Slot /@ Range[nSlots] /. #2;
ReplaceAll[
(*this function protects the final slots*)
Function[Null,
(Function @@ {
Null,
fuToken[##],
HoldAll
}) @@ argsWrapped, HoldAll]
,
Join[
{fuToken -> optionalFu @@ Hold @@ Unevaluated@#},
OwnValues@argsWrapped
]
]
], HoldAll];