use 5.020; use feature 'signatures'; no warnings 'experimental::signatures'; use Carp 'croak'; sub option ( $key, $def, $options ) { if( !exists $options->{ $key } ) { $options->{ $key } = $def; } return $options } sub required ( $key, $options ) { if( !exists $options->{ $key } ) { croak sprintf 'Need the "%s" option passed in', $key; } return $options } sub foo( %options ) { option baz => 'Superman', option universe => 'DC', \%options; return \%options } sub req( %options ) { required 'run', option baz => 'Superman', \%options; return \%options } use Test2::V0 '-no_srand'; is option('baz' => 'default', {}), { baz => 'default' }, 'Setting a default'; is foo(), { baz => 'Superman', universe => 'DC' }, 'Default values'; is foo(baz => 0), { baz => '0', universe => 'DC' }, 'False value'; is foo(baz => undef), { baz => undef, universe => 'DC' }, 'Undef but present value is kept'; is foo(baz => undef), { baz => undef, universe => 'DC' }, 'Undef but present value is kept'; ok dies { req( baz => 'Wonderwoman' ) }, 'A missing obligatory option dies'; ok lives { req( run => undef, baz => 'Wonderwoman' ) }, 'Passing the obligatory option lives, even if undefined'; #class cfoo 0.01 { # field $baz; # field $universe; # # method foo( $self, %options ) { # option baz => $self->baz, # option universe => $self->universe, # \%options; # # return \%options # } #} #my $f = cfoo->new( baz => 'objSuperman', universe => 'DC' ); #is $f->foo( baz => undef ), { baz => undef, universe => 'meth_DC' }, 'Positional parameters work'; done_testing;