The argument processing that you are doing here suffers
from the problem that if someone calls your function and
has a typo in their hash key, there is no check for it.
Also people cannot choose to explicitly use false values.
At the expense of considerable overhead, the approach I
describe at Re (tilly) 2: passing subroutine arguments directly into a hash solves both problems.