File: 019_attribute_lazy_initializer.t

package info (click to toggle)
libmoose-perl 1.09-2
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 3,004 kB
  • ctags: 1,472
  • sloc: perl: 25,387; makefile: 2
file content (150 lines) | stat: -rw-r--r-- 3,860 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#!/usr/bin/perl

use strict;
use warnings;

use Test::More;
use Test::Exception;


{
    package Foo;
    use Moose;

    has 'foo' => (
        reader => 'get_foo',
        writer => 'set_foo',
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'foo', '... got the right name');

            $callback->($value * 2);
        },
    );

    has 'lazy_foo' => (
        reader      => 'get_lazy_foo',
        lazy        => 1,
        default     => 10,
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'lazy_foo', '... got the right name');

            $callback->($value * 2);
        },
    );

    has 'lazy_foo_w_type' => (
        reader      => 'get_lazy_foo_w_type',
        isa         => 'Int',
        lazy        => 1,
        default     => 20,
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'lazy_foo_w_type', '... got the right name');

            $callback->($value * 2);
        },
    );

    has 'lazy_foo_builder' => (
        reader      => 'get_lazy_foo_builder',
        builder     => 'get_foo_builder',
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'lazy_foo_builder', '... got the right name');

            $callback->($value * 2);
        },
    );

    has 'lazy_foo_builder_w_type' => (
        reader      => 'get_lazy_foo_builder_w_type',
        isa         => 'Int',
        builder     => 'get_foo_builder_w_type',
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'lazy_foo_builder_w_type', '... got the right name');

            $callback->($value * 2);
        },
    );

    sub get_foo_builder        { 100  }
    sub get_foo_builder_w_type { 1000 }
}

{
    my $foo = Foo->new(foo => 10);
    isa_ok($foo, 'Foo');

    is($foo->get_foo,             20, 'initial value set to 2x given value');
    is($foo->get_lazy_foo,        20, 'initial lazy value set to 2x given value');
    is($foo->get_lazy_foo_w_type, 40, 'initial lazy value with type set to 2x given value');
    is($foo->get_lazy_foo_builder,        200, 'initial lazy value with builder set to 2x given value');
    is($foo->get_lazy_foo_builder_w_type, 2000, 'initial lazy value with builder and type set to 2x given value');
}

{
    package Bar;
    use Moose;

    has 'foo' => (
        reader => 'get_foo',
        writer => 'set_foo',
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'foo', '... got the right name');

            $callback->($value * 2);
        },
    );

    __PACKAGE__->meta->make_immutable;
}

{
    my $bar = Bar->new(foo => 10);
    isa_ok($bar, 'Bar');

    is($bar->get_foo, 20, 'initial value set to 2x given value');
}

{
    package Fail::Bar;
    use Moose;

    has 'foo' => (
        reader => 'get_foo',
        writer => 'set_foo',
        isa    => 'Int',
        initializer => sub {
            my ($self, $value, $callback, $attr) = @_;

            ::isa_ok($attr, 'Moose::Meta::Attribute');
            ::is($attr->name, 'foo', '... got the right name');

            $callback->("Hello $value World");
        },
    );

    __PACKAGE__->meta->make_immutable;
}

dies_ok {
    Fail::Bar->new(foo => 10)
} '... this fails, because initializer returns a bad type';

done_testing;