sub new { my $class = shift; my %self = %{$_[0]} if ref $_[0]; ... } #### # Class->new(); # Class->new({ k=>v, ... }); sub new { my $class = shift; my %self = ref $_[0] ? %{$_[0]} : (); ... #### # Class->new(); # Class->new({ k=>v, ... }); # Class->new( k=>v, ... ); sub new { my $class = shift; my %self = ref $_[0] ? %{$_[0]} : @_; ... } #### # Class->new(); # Class->new( k=>v, ... ); sub new { my ($class, %self) = @_; ... }