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