The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use v5.20;
use Object::Exercise;
use Test::More;

my $frob = Frobnicate->new;

my @testz =
(
    [ [ qw( set foo bar ) ], [ qw( bar ) ]  ],
    [ [ qw( get foo     ) ], [ qw( bar ) ]  ],

    [ [ qw( set foo     ) ], [ qw( bar ) ]  ], 
    [ [ qw( get foo     ) ], [ undef     ]  ],

);

$frob->$exercise( 'nofinish'    );
$frob->$exercise( @testz        ) for ( 1 .. 2 );
$frob->$exercise( 'finish'      );

package Frobnicate;

use strict;

sub new
{
    my $proto = shift;

    bless {}, ref $proto || $proto
}

sub set
{
    my ( $obj, $key, $value ) = @_;

    @_ > 2
    ? $obj->{ $key } = $value
    : delete $obj->{ $key }
}

sub get
{
    my ( $obj, $key ) = @_;

    $obj->{ $key }
}

0
__END__