http://qs321.pair.com?node_id=765727

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I'm writing a module that, from the constructor, will accept essentially named parameters, and I'm wondering which of the two common ways of doing so is preferred.

Should I accept a single argument of a hashref:

# new MyModule({arg1 => 'val1', arg2 => 'val2'}) sub new { my $class = shift; croak('oh crap!') if ref($_[0]) != 'HASH' my %args = %{$_[0]}; }

Or should I cast all arguments into a hash:

# new MyModule(arg1 => 'val1', arg2 => 'val2') sub new { my $class = shift; croak('oh crap!') if @_ % 2; my %args = @_; }

I've seen both techniques used in many places, but which one is generally preferred and/or considered better API design?