stringf FORMAT, LIST; stringf => { codes => { ... }, # the conversions! prepare_input => sub { ... }, # deals with LIST as a whole iterator => sub { ... }, # loops over markers, calling conversions formatter => sub { ... }, # postproc output for common -3.1# behavior } codes => { x => sub { my ($self, $input, $arg, $formatter) = @_; # input is also in $_ return $str; # or \$str to avoid postprocessing }, } kinda of conversions: stringf "format %x %y %z", $positional, $based, $interpolation; stringf "%x-%y...%z, $object_to_format stringf "This is the %{adj}s %{noun}s ever.", { adj => $a, noun => $n }; less likely: stringf "%x-%y...%z, $obj1, $obj2;