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

use strict;
use warnings;

use Test::More;
use Test::Exception;
BEGIN {
    plan skip_all => "Moose 0.68 required for this test" unless eval { require Moose  && Moose->VERSION('0.68') };
    plan tests => 5;
}

use Test::Exception;

{
    package Headers;
    use Mouse;
    has 'foo' => ( is => 'rw' );
}
{
    package Response;
    use Mouse;
    use Mouse::Util::TypeConstraints;

    type 'HeadersType' => where { defined $_ && eval { $_->isa('Headers') } };
    coerce  'HeadersType' =>
        from 'HashRef' => via {
            Headers->new(%{ $_ });
        },
    ;

    has headers => (
        is     => 'rw',
        isa    => 'HeadersType',
        coerce => 1,
    );
}
{
    package Mosponse;
    use Moose;
    extends qw(Response);
    ::lives_ok { extends qw(Response) } "extend Mouse class with Moose";
}

{
    local $TODO = "Doesn't work in the constructor yet?";
    my $r = Mosponse->new(headers => { foo => 'bar' });
    isa_ok($r->headers, 'Headers');
    is(eval{$r->headers->foo}, 'bar');
}

{
    my $r = Mosponse->new;
    $r->headers({foo => 'yay'});
    isa_ok($r->headers, 'Headers');
    is($r->headers->foo, 'yay');
}