File Coverage

blib/lib/Mooish/Base.pm
Criterion Covered Total %
statement 67 80 83.7
branch 20 28 71.4
condition 7 12 58.3
subroutine 12 12 100.0
pod n/a
total 106 132 80.3


line stmt bran cond sub pod time code
1             package Mooish::Base;
2             $Mooish::Base::VERSION = '1.005';
3 9     9   1916744 use v5.10;
  9         36  
4 9     9   57 use strict;
  9         96  
  9         233  
5 9     9   40 use warnings;
  9         15  
  9         556  
6 9     9   4842 use Import::Into;
  9         29549  
  9         729  
7              
8             require Mooish::AttributeBuilder;
9             require Type::Tiny;
10             require namespace::autoclean;
11              
12 9   100 9   64 use constant FLAVOUR => $ENV{MOOISH_BASE_FLAVOUR} // 'Moo';
  9         18  
  9         966  
13 9   50 9   57 use constant ROLE_FLAVOUR => $ENV{MOOISH_BASE_ROLE_FLAVOUR} // (FLAVOUR . '::Role');
  9         16  
  9         818  
14              
15 9   100     1939 use constant EXTRA_MODULES => $ENV{MOOISH_BASE_EXTRA_MODULES} // join ';', qw(
16             Hook::AfterRuntime
17             MooX::TypeTiny
18             MooseX::XSAccessor
19 9     9   54 );
  9         74  
20              
21             use constant EXTRA_MODULES_AVAILABLE => {
22 9         1098 'Hook::AfterRuntime' => !!eval { require Hook::AfterRuntime; Hook::AfterRuntime->VERSION('0.003'); 1 },
  0         0  
  0         0  
23 9         1075 'MooX::TypeTiny' => !!eval { require MooX::TypeTiny; MooX::TypeTiny->VERSION('0.002002'); 1 },
  0         0  
  0         0  
24 9         768 'MooX::XSConstructor' => !!eval { require MooX::XSConstructor; MooX::XSConstructor->VERSION('0.003002'); 1 },
  0         0  
  0         0  
25             'MooseX::XSConstructor' => !!
26 9         862 eval { require MooseX::XSConstructor; MooseX::XSConstructor->VERSION('0.001002'); 1 },
  0         0  
  0         0  
27 9         15 'MooseX::XSAccessor' => !!eval { require MooseX::XSAccessor; MooseX::XSAccessor->VERSION('0.010'); 1 },
  9         1890  
  0         0  
  0         0  
28 9     9   125 };
  9         19  
29              
30 9         1005 use constant EXTRA_MODULES_RULES => {
31             'Hook::AfterRuntime' => {type => 'Moose'},
32             'MooX::TypeTiny' => {type => 'Moo'},
33             'MooX::XSConstructor' => {type => 'Moo'},
34             'MooseX::XSConstructor' => {type => 'Moose'},
35             'MooseX::XSAccessor' => {type => 'Moose', role => !!1},
36 9     9   58 };
  9         44  
37              
38             BEGIN {
39 9 100   9   764 eval 'require ' . FLAVOUR or die $@;
40 5 50       42438 eval 'require ' . ROLE_FLAVOUR or die $@;
41             }
42              
43             our $DEBUG;
44              
45             sub _uses_extra_module
46             {
47 30     30   53 my ($module, $class_type, $role) = @_;
48              
49             state $wanted_modules = {
50 5         15 map { $_ => 1 }
51 30         45 map { s{^\s+}{}; s{\s+$}{}; $_ }
  5         16  
  5         10  
  5         10  
52             split ';', EXTRA_MODULES
53             };
54              
55             return $wanted_modules->{$module}
56             && EXTRA_MODULES_AVAILABLE->{$module}
57             && EXTRA_MODULES_RULES->{$module}{type} eq $class_type
58             && (!$role || EXTRA_MODULES_RULES->{$module}{role})
59 30   33     152 ;
60             }
61              
62             sub import
63             {
64 6     6   17651 my $me = shift;
65 6         16 my $pkg = caller;
66              
67 6         15 my $class_type = FLAVOUR;
68 6         11 my $role_type = ROLE_FLAVOUR;
69 6         17 my $role = !!0;
70 6         10 my $standard = !!0;
71              
72 6         21 foreach my $arg (@_) {
73 5 100       21 if ($arg eq -role) {
    50          
74 3         8 $role = !!1;
75             }
76             elsif ($arg eq -standard) {
77 2         4 $standard = !!1;
78             }
79             }
80              
81             # Moo is the best choice for module development
82 6 100       22 if ($standard) {
83 2         2 $class_type = 'Moo';
84 2         3 $role_type = 'Moo::Role';
85             }
86              
87 6 100       17 my $engine = $role ? $role_type : $class_type;
88 6         47 $engine->import::into($pkg);
89 6 100       7063 Mooish::AttributeBuilder->import::into($pkg, ($standard ? (-standard) : ()));
90 6         2404 Types::Common->import::into($pkg, -types);
91 6         650432 namespace::autoclean->import(-cleanee => $pkg);
92              
93             # install extra modules
94              
95 30         61 my %extra_modules = map { $_ => _uses_extra_module($_, $class_type, $role) }
96 6         310 keys %{(EXTRA_MODULES_RULES)};
  6         26  
97              
98             MooX::TypeTiny->import::into($pkg)
99 6 50       28 if $extra_modules{'MooX::TypeTiny'};
100              
101             MooX::XSConstructor->import::into($pkg)
102 6 50       20 if $extra_modules{'MooX::XSConstructor'};
103              
104             MooseX::XSConstructor->import::into($pkg)
105 6 50       21 if $extra_modules{'MooseX::XSConstructor'};
106              
107             MooseX::XSAccessor->import::into($pkg)
108 6 50       17 if $extra_modules{'MooseX::XSAccessor'};
109              
110             # special handling for Hook::AfterRuntime - warn if it can't be used on Moose
111 6 50 33     64 if ($extra_modules{'Hook::AfterRuntime'}) {
    50          
112 0         0 Hook::AfterRuntime::after_runtime { $pkg->meta->make_immutable };
  0         0  
113             }
114             elsif ($class_type eq 'Moose' && !$role) {
115 0         0 warn "Mooish::Base can't make $pkg Moose class immutable - please install Hook::AfterRuntime module";
116             }
117              
118             # put debug information if requested
119 6 100       382 $DEBUG->{$pkg} = {
120             class_type => $class_type,
121             role_type => $role_type,
122             role => $role,
123             standard => $standard,
124             extra_modules => \%extra_modules,
125             } if $DEBUG;
126             }
127              
128             1;
129              
130             __END__