I just want to make two quick comments:
Imagine working on a huge
system where you have many virtually identical object methods that take a scalar, or an array, or an array ref, or a hash_ref using
named parameters but won't accept a hash, etc. What interface do you use? And what if the data structure returned seems to be
arbitrary? I've worked on systems that do that and they are Not Fun.
Use whichever interface you prefer! :)
If the data structure returned is arbitrary, then the system is not being strict in what it emits. That's not the side of the contract that you're discussing.