The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/local/bin/perl

package X;
use strict;

use lib qw ( ./t );
use Test;

use Class::MethodMaker
  get_set  => [qw[  setable_00 ]],
  get_set  => [qw[ -set_once           dier_00 dier_01]],
  get_set  => [qw[  setable_01 -set_once dier_04]],
  get_set  => [qw[ -set_once_or_die    dier_02 dier_03]],
  get_set  => [qw[ -set_once_or_warn   warner_00 warner_01]],
  get_set  => [qw[ -set_once_or_carp   carper_00 carper_01]],
  get_set  => [qw[ -set_once_or_cluck  clucker_00 clucker_01]],
  get_set  => [qw[ -set_once_or_croak   croaker_00 croaker_01]],
  get_set  => [qw[ -set_once_or_confess   confessor_00 confessor_01]],
  get_set  => [qw[ -set_once_or_myonce  myonce_00 myonce_01]],
  ;

sub new { bless {}, shift; }

my $o = new X;

# trigger a get on all values
TEST { 1 }; # (1)
TEST { !defined $o->setable_00 }; # (2)
TEST { !defined $o->setable_01 }; # (3)
TEST { !defined $o->dier_00 }; # (4)
TEST { !defined $o->dier_01 }; # (5)
TEST { !defined $o->dier_02 }; # (6)
TEST { !defined $o->dier_03 }; # (7)
TEST { !defined $o->dier_04 }; # (8)
TEST { !defined $o->warner_00 }; # (9)
TEST { !defined $o->warner_01 }; # (10)
TEST { !defined $o->carper_00 }; # (11)
TEST { !defined $o->carper_01 }; # (12)
TEST { !defined $o->clucker_00 }; # (13)
TEST { !defined $o->clucker_01 }; # (14)
TEST { !defined $o->croaker_00 }; # (15)
TEST { !defined $o->croaker_01 }; # (16)
TEST { !defined $o->confessor_00 }; # (17)
TEST { !defined $o->confessor_01 }; # (18)
TEST { !defined $o->myonce_00 }; # (19)
TEST { !defined $o->myonce_01 }; # (20)

# trigger a set on all values
TEST { $o->setable_00(1) == 1 }; # (21)
TEST { $o->setable_01(2) == 2 }; # (22)
TEST { $o->dier_00(3) == 3 }; # (23)
TEST { $o->dier_01(4) == 4 }; # (24)
TEST { $o->dier_02(5) == 5 }; # (25)
TEST { $o->dier_03(6) == 6 }; # (26)
TEST { $o->dier_04(7) == 7 }; # (27)
TEST { $o->warner_00(8) == 8 }; # (28)
TEST { $o->warner_01(9) == 9 }; # (29)
TEST { $o->carper_00(10) == 10 }; # (30)
TEST { $o->carper_01(11) == 11 }; # (31)
TEST { $o->clucker_00(12) == 12 }; # (32)
TEST { $o->clucker_01(13) == 13 }; # (33)
TEST { $o->croaker_00(14) == 14 }; # (34)
TEST { $o->croaker_01(15) == 15 }; # (35)
TEST { $o->myonce_00(16) == 16 }; # (36)
TEST { $o->myonce_01(17) == 17 }; # (37)

# trigger ANOTHER set on all values
my $w; # 1 if a warn() of sorts was called.
$SIG{__WARN__} = sub { $w=1; die(@_) };
sub myonce { die "myonce" };

TEST  {  eval{$w=0};  eval{$o->setable_00(1)    };  $w == 0 &&  !length($@)  }; # (38)
TEST  {  eval{$w=0};  eval{$o->setable_01(2)    };  $w == 0 &&  !length($@)  }; # (39)
TEST  {  eval{$w=0};  eval{$o->dier_00(3)       };  $w == 0 &&   length($@)  }; # (40)
TEST  {  eval{$w=0};  eval{$o->dier_01(4)       };  $w == 0 &&   length($@)  }; # (41)
TEST  {  eval{$w=0};  eval{$o->dier_02(5)       };  $w == 0 &&   length($@)  }; # (42)
TEST  {  eval{$w=0};  eval{$o->dier_03(6)       };  $w == 0 &&   length($@)  }; # (43)
TEST  {  eval{$w=0};  eval{$o->dier_04(7)       };  $w == 0 &&   length($@)  }; # (44)
TEST  {  eval{$w=0};  eval{$o->warner_00(8)     };  $w == 1 &&   length($@)  }; # (45)
TEST  {  eval{$w=0};  eval{$o->warner_01(9)     };  $w == 1 &&   length($@)  }; # (46)
TEST  {  eval{$w=0};  eval{$o->carper_00(10)    };  $w == 1 &&   length($@)  }; # (47)
TEST  {  eval{$w=0};  eval{$o->carper_01(11)    };  $w == 1 &&   length($@)  }; # (48)
TEST  {  eval{$w=0};  eval{$o->clucker_00(12)   };  $w == 1 &&   length($@)  }; # (49)
TEST  {  eval{$w=0};  eval{$o->clucker_01(13)   };  $w == 1 &&   length($@)  }; # (50)
TEST  {  eval{$w=0};  eval{$o->croaker_00(14)   };  $w == 0 &&   length($@)  }; # (51)
TEST  {  eval{$w=0};  eval{$o->croaker_01(15)   };  $w == 0 &&   length($@)  }; # (52)
TEST  {  eval{$w=0};  eval{$o->confessor_00(14) };  $w == 0 &&  !length($@) }; # (53)
TEST  {  eval{$w=0};  eval{$o->confessor_01(15) };  $w == 0 &&  !length($@) }; # (54)
TEST  {  eval{$w=0};  eval{$o->myonce_00(16)    };  $w == 0 &&  $@ =~ /^myonce/ }; # (55)
TEST  {  eval{$w=0};  eval{$o->myonce_01(17)    };  $w == 0 &&  $@ =~ /^myonce/ }; # (56)

exit 0;