in reply to code tidying - re-inventing the wheel?

However you do it, the function that does the conversion is going to have to know about the names of the default arguments. You may be able to shorten it a bit by making fix_args a regular function (instead of a method) and not using named parameters for it:
my $arg = fix_args([qw(-name -age -mood)],\@_);
but I can't think of a way to make it much less clumsy than that. On the other hand, your syntax doesn't really seem that clumsy to me...