Use
Kavorka (and
Moops in case of object-oriented programming) for flexible calling-style (both plain key/value and hashref) and sensible error messages and type constraints. It's the best
of the bunch. my_func only contains logic - look at all the boilerplate code you did not have to write!
Positional parameters and named parameters may be mixed, but each parameter cannot be both. It is not a good idea because that would preclude optional parameters, hence this is not supported.
use Kavorka;
fun my_func(Str :$message!, Bool :$newline) {
print "Message received: $message";
print "\n" if $newline;
}
my_func(message => 'x');
my_func(message => 'y', newline => 1);
my_func({message => 'z'});
my_func();
# Named parameter `message` is required
my_func(message => do { require DateTime; DateTime->now });
# Reference bless( {...) did not pass type constraint "Str"