The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
=head1 PURPOSE

Test basic L<Method::Generate::ClassAccessor> functionality.

=head1 AUTHOR

Toby Inkster E<lt>tobyink@cpan.orgE<gt>.

=head1 COPYRIGHT AND LICENCE

This software is copyright (c) 2013 by Toby Inkster.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut

use strict;
use warnings;
use Test::More;

use Method::Generate::ClassAccessor;
use Sub::Defer;
use constant Gen => 'Method::Generate::ClassAccessor';
use constant Pkg => 'Local::Test::Package';

my $generator = Gen->new;
isa_ok $generator, 'Method::Generate::Accessor';

$generator->generate_method(
	Pkg,
	foo => {
		is        => 'rw',
		writer    => 'set_foo',
		reader    => 'get_foo',
		accessor  => 'access_foo',
		predicate => 'has_foo',
		clearer   => 'clear_foo',
		handles   => [qw/ bar baz /],
	},
);

my @methods = qw/
	set_foo get_foo access_foo has_foo clear_foo
	_assert_foo bar baz
/;

can_ok Pkg, @methods;

Pkg->set_foo('42');
ok Pkg->has_foo;
is(Pkg->get_foo, 42);
Pkg->clear_foo;
ok not Pkg->has_foo;
Pkg->access_foo('Local::Bottoms');
is(Pkg->access_foo, 'Local::Bottoms');

ok not eval { Pkg->baz };
like $@, qr{^Can't locate object method "baz" via package "Local::Bottoms"};

done_testing;