The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More;

{

    package Standard;

    use Moose;

    has 'thing'    => ( is => 'rw' );
    has '_private' => ( is => 'rw' );
}

{

    package SAA;

    use Moose;
    use MooseX::SemiAffordanceAccessor;

    has 'thing'    => ( is => 'rw' );
    has '_private' => ( is => 'rw' );
}

{

    package SAA3;

    use Moose;
    use MooseX::SemiAffordanceAccessor;

    has 'ro'     => ( is => 'ro' );
    has 'thing'  => ( is => 'rw', reader => 'get_thing' );
    has 'thing2' => ( is => 'rw', writer => 'set_it' );
}

{

    package SAA4;

    use Moose;
    use MooseX::SemiAffordanceAccessor;

    has bare => ( is => 'bare' );
}

ok( Standard->can('thing'),      'Standard->thing() exists' );
ok( !Standard->can('set_thing'), 'Standard->set_thing() does not exist' );
ok( Standard->can('_private'),   'Standard->_private() exists' );
ok( !Standard->can('_set_private'),
    'Standard->_set_private() does not exist' );

ok( SAA->can('thing'),        'SAA->thing() exists' );
ok( SAA->can('set_thing'),    'SAA->set_thing() exists' );
ok( SAA->can('_private'),     'SAA->_private() exists' );
ok( SAA->can('_set_private'), 'SAA->_set_private() exists' );

ok( SAA3->can('ro'),          'SAA3->ro exists' );
ok( !SAA3->can('set_ro'),     'SAA3->set_ro does not exist' );
ok( SAA3->can('thing'),       'SAA3->thing exists' );
ok( !SAA3->can('set_thing'),  'SAA3->set_thing does not exist' );
ok( SAA3->can('thing2'),      'SAA3->thing2 exists' );
ok( !SAA3->can('set_thing2'), 'SAA3->set_thing2 does not exist' );
ok( SAA3->can('set_it'),      'SAA3->set_it does exist' );

ok( !SAA4->can('bare'),     'SAA4->bare does not exist' );
ok( !SAA4->can('set_bare'), 'SAA4->set_bare does not exist' );

done_testing();