File Coverage

blib/lib/MooX/VariantAttribute.pm
Criterion Covered Total %
statement 32 33 96.9
branch 13 16 81.2
condition n/a
subroutine 10 11 90.9
pod n/a
total 55 60 91.6


line stmt bran cond sub pod time code
1             package MooX::VariantAttribute;
2              
3 4     4   544190 use strict;
  4         8  
  4         143  
4 4     4   17 use warnings;
  4         7  
  4         230  
5 4     4   20 use Carp qw/croak/;
  4         5  
  4         190  
6 4     4   1959 use MooX::ReturnModifiers;
  4         2960  
  4         2265  
7             our $VERSION = '0.12';
8              
9             sub import {
10 12     12   19421 my ( $package, @import ) = @_;
11              
12 12         36 my $target = caller;
13 12         74 my %modifiers = return_modifiers( $target, [qw/has around with sub/] );
14              
15             my $variant = sub {
16 17     17   625316 my ( $name, %spec ) = @_;
17              
18 17 100       212 if ( my $builder = $spec{builder} ) {
19 3 50       25 my $build_name = $builder =~ m/^1$/ ? sprintf "_build_%s", $name : $builder;
20             $modifiers{around}->($build_name, sub {
21 3     3   7950 my ($orig, $self) = (shift, shift);
22 3         17 return $self->_given_when($self->$orig(@_), $spec{given}, $spec{when}, $name);
23 3         27 });
24             }
25              
26 17         5777 $modifiers{has}->( $name => _construct_attribute( $name, %spec ) );
27              
28 12         717 };
29              
30             $target->can('_given_when')
31 12 50       135 or $modifiers{with}->('MooX::VariantAttribute::Role');
32              
33 12         45924 $modifiers{sub}->('variant', $variant);
34              
35 12         867 return 1;
36             }
37              
38             sub _construct_attribute {
39 17     17   86 my ( $name, %spec ) = @_;
40              
41             my $trigger = sub {
42 69     69   593471 return $_[0]->_given_when( $_[1], $spec{given}, $spec{when}, $name );
43 17         91 };
44              
45             return (
46             is => 'rw',
47             trigger => $trigger,
48             (
49             $spec{default} ? (
50             default => sub {
51             return $_[0]->_given_when(
52             (
53             ref $spec{default} eq 'CODE'
54             ? $spec{default}->()
55             : $spec{default}
56             ),
57             $spec{given},
58             $spec{when},
59 3 100   3   8164 $name
60             );
61             }
62             ) : ()
63             ),
64             (
65             $spec{builder} ? (
66             builder => ref $spec{builder} eq 'CODE' ? sub {
67             return $_[0]->_given_when(
68             $spec{builder}->(),
69             $spec{given},
70             $spec{when},
71 0     0   0 $name
72             );
73             } : $spec{builder}
74             ) : ()
75             ),
76 17 100       119 (map {(
    50          
    100          
77 102 100       348 $spec{$_} ? ( $_ => $spec{$_} ) : ()
78             )} qw/lazy predicate clearer required reader writer/),
79             );
80             }
81              
82             1;
83              
84             __END__