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 ClassFoo;

    use Moose;
    use MooseX::ClassAttribute;

    class_has 'chas' => (
        isa         => 'Int',
        is          => 'ro',
        default     => 1,
        initializer => sub { $_[2]->( $_[1] + 1 ) }
    );
}

{
    package ClassBar;
    use Moose;

    has 'chas' => (
        isa         => 'Int',
        is          => 'ro',
        default     => 1,
        initializer => sub { $_[2]->( $_[1] + 1 ) }
    );
}

{
    package ClassBaz;
    use Moose;
    use MooseX::ClassAttribute;

    class_has 'chas' => (
        isa     => 'Str',
        is      => 'rw',
        default => 'Foobar',
        trigger => sub { die __PACKAGE__ }
    );
}

{
    package ClassQuz;
    use Moose;

    has 'chas' => (
        isa     => 'Str',
        is      => 'rw',
        default => 'Foobar',
        trigger => sub { die __PACKAGE__ }
    );
}

{
    local $TODO
        = 'Class attributes with an initializer are not initialized properly';

    is(
        ClassFoo->chas, 2,
        "ClassFoo's class_has (ClassAttribute) initializer fires"
    );
}

is(
    ClassBar->new->chas, 2,
    "ClassBar's has (non-ClassAttribute) initializer fires"
);

eval { ClassBaz->new->chas('foobar') };
like(
    $@, qr/ClassBaz/,
    "ClassBaz's class_has (ClassAttribute) trigger fires"
);

eval { ClassQuz->new->chas('foobar') };
like( $@, qr/ClassQuz/, "ClassQuz's has (non-ClassAttribute) trigger fires" );

done_testing();