5e59ae8f9061019729ca04f8bd23068c614ba247
[gitmo/Moo.git] / t / overloaded-coderefs.t
1 use strict;
2 use warnings;
3 use Test::More;
4
5 {
6         package Dark::Side;
7         use overload
8                 q[&{}]   => sub { shift->to_code },
9                 fallback => 1;
10         sub new {
11                 my $class = shift;
12                 my $code = shift;
13                 bless \$code, $class;
14         }
15         sub to_code {
16                 my $self = shift;
17                 eval "sub { $$self }";
18         }
19 }
20
21 {
22         package The::Force;
23         use Sub::Quote;
24         use base 'Dark::Side';
25         sub to_code {
26                 my $self = shift;
27                 return quote_sub $$self;
28         }
29 }
30
31 my $darkside = Dark::Side->new('my $dummy = "join the dark side"; $_[0] * 2');
32 is($darkside->(6), 12, 'check Dark::Side coderef');
33
34 my $theforce = The::Force->new('my $dummy = "use the force Luke"; $_[0] * 2');
35 is($theforce->(6), 12, 'check The::Force coderef');
36
37 {
38         package Doubleena;
39         use Moo;
40         has a => (is => "ro", coerce => $darkside, isa => sub { 1 });
41         has b => (is => "ro", coerce => $theforce, isa => The::Force->new('my $z = "I am your father"'));
42 }
43
44 my $o = Doubleena->new(a => 11, b => 12);
45 is($o->a, 22, 'non-Sub::Quoted inlined coercion overload works');
46 is($o->b, 24, 'Sub::Quoted inlined coercion overload works');
47
48 use B::Deparse;
49 my $constructor = B::Deparse->new->coderef2text(Doubleena->can('new'));
50
51 like($constructor, qr{use the force Luke}, 'Sub::Quoted coercion got inlined');
52 unlike($constructor, qr{join the dark side}, 'non-Sub::Quoted coercion was not inlined');
53 like($constructor, qr{I am your father}, 'Sub::Quoted isa got inlined');
54
55 done_testing;