File Coverage

blib/lib/MooX/VariantAttribute.pm
Criterion Covered Total %
statement 37 38 97.3
branch 13 16 81.2
condition n/a
subroutine 11 12 91.6
pod n/a
total 61 66 92.4


line stmt bran cond sub pod time code
1             package MooX::VariantAttribute;
2              
3 4     4   304167 use strict;
  4         18  
  4         96  
4 4     4   21 use warnings;
  4         7  
  4         96  
5 4     4   21 use Carp qw/croak/;
  4         7  
  4         159  
6 4     4   1601 use MooX::ReturnModifiers;
  4         2398  
  4         907  
7             our $VERSION = '0.09';
8              
9             sub import {
10 12     12   6682 my ( $package, @import ) = @_;
11              
12 12         27 my $target = caller;
13 12         40 my %modifiers = return_modifiers( $target, [qw/has around with/] );
14              
15             my $variant = sub {
16 17     17   135519 my ( $name, %spec ) = @_;
17              
18 17 100       59 if ( my $builder = $spec{builder} ) {
19 3 50       20 my $build_name = $builder =~ m/^1$/ ? sprintf "_build_%s", $name : $builder;
20             $modifiers{around}->($build_name, sub {
21 3     3   4951 my ($orig, $self) = (shift, shift);
22 3         9 return $self->_given_when($self->$orig(@_), $spec{given}, $spec{when}, $name);
23 3         19 });
24             }
25              
26 17         2590 $modifiers{has}->( $name => _construct_attribute( $name, %spec ) );
27              
28 12         353 };
29              
30             $target->can('_given_when')
31 12 50       98 or $modifiers{with}->('MooX::VariantAttribute::Role');
32              
33 4     4   30 { no strict 'refs'; *{"${target}::variant"} = $variant; }
  4         7  
  4         1098  
  12         31309  
  12         22  
  12         57  
34              
35 12         319 return 1;
36             }
37              
38             sub _construct_attribute {
39 17     17   47 my ( $name, %spec ) = @_;
40              
41             my $trigger = sub {
42 69     69   27920 return $_[0]->_given_when( $_[1], $spec{given}, $spec{when}, $name );
43 17         54 };
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   5078 $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       77 (map {(
    50          
    100          
77 102 100       211 $spec{$_} ? ( $_ => $spec{$_} ) : ()
78             )} qw/lazy predicate clearer required reader writer/),
79             );
80             }
81              
82             1;
83              
84             __END__