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;
use Test::Moose;

{
	package Test;
	use Moose;
	use MooseX::RemoteHelper;

	has attr0 => (
		isa        => 'Bool',
		is         => 'ro',
		lazy       => 1,
		default    => sub { 1 },
		serializer => sub {
			my ( $attr, $instance ) = @_;
			return $attr->get_value( $instance ) ? 'Y' : 'N';
		},
	);

	has attr1 => (
		isa         => 'Str',
		is          => 'ro',
	);

	has _attr2 => (
		isa      => 'Str',
		is       => 'ro',
		lazy     => 1,
		default  => sub { 'foo' },
		init_arg => undef,
		reader   => undef,
		writer   => undef,
	);
}

subtest t0 => sub {
	my $t = Test->new;

	is $t->attr0, 1, 'attr0 is 1';

	isa_ok my $attr0 = $t->meta->get_attribute('attr0'), 'Class::MOP::Attribute';

	is $attr0->serialized( $t ),  'Y',    'attr0 serializes';
	isa_ok $t, 'Test';
};

subtest t1 => sub {
	my $t = Test->new({ attr0 => 0 });

	is $t->attr0, 0, 'attr0 is 0';

	isa_ok my $attr0 = $t->meta->get_attribute('attr0'), 'Class::MOP::Attribute';

	is $attr0->serialized( $t ),  'N',    'attr0 serializes';
	isa_ok $t, 'Test';
};

subtest t2 => sub {
	my $t = Test->new({ attr1 => 'foo' });

	is $t->attr1, 'foo', 'attr1';

	isa_ok my $attr1 = $t->meta->get_attribute('attr1'), 'Class::MOP::Attribute';

	is $attr1->serialized( $t ),  'foo',    'attr1 serializes';
	isa_ok $t, 'Test';
};

subtest t3 => sub {
	my $t = Test->new;

	isa_ok my $attr2 = $t->meta->get_attribute('_attr2'), 'Class::MOP::Attribute';

	is $attr2->serialized( $t ),  'foo',    'attr2 serializes';
	isa_ok $t, 'Test';
};

done_testing;