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

use warnings;
use strict;

use Test::More 'no_plan';

{
  my %didget;
  my %didset;
  {
    package Foo;
    use Class::Accessor::Classy;
    with 'new';
    getter {
      my $self = shift;
      my ($k) = @_;
      $didget{$k} ||= 0;
      $didget{$k}++;
      return($self->{$k});
    };
    setter {
      my $self = shift;
      my ($k, $v) = @_;
      $didset{$k} ||= 0;
      $didset{$k}++;
      $self->{$k} = $v;
    };
    ro 'q';
    rw 's';
    no  Class::Accessor::Classy;
  }
  can_ok('Foo', 'new');
  can_ok('Foo', 'q');
  can_ok('Foo', 'get_q');
  can_ok('Foo', 's');
  can_ok('Foo', 'get_s');
  can_ok('Foo', 'set_s');
  ok(! Foo->can('set_q'), 'do not want set_q');
  my $make = Foo->new(q => 5, s => 2);
  is($make->q, 5, 'getter ok');
  is($make->s, 2, 'getter ok');
  is($make->set_s(3), 3);
  is($make->s, 3,     'setter ok');
  is($make->get_s, 3, 'setter ok');
  eval {Foo->new({q => 4})};
  ok($@, 'oops');
  like($@, qr/odd number/, 'message');
  is_deeply(\%didget, {
    q => 1,
    s => 3,
  }, 'getter counts');
  is_deeply(\%didset, {
    s => 1,
  }, 'getter counts');
}

# vi:ts=2:sw=2:et:sta