File Coverage

blib/lib/Mite/Trait/HasRequiredMethods.pm.mite.pm
Criterion Covered Total %
statement 62 89 69.6
branch 5 22 22.7
condition 1 14 7.1
subroutine 12 21 57.1
pod 0 2 0.0
total 80 148 54.0


line stmt bran cond sub pod time code
1             {
2              
3             package Mite::Trait::HasRequiredMethods;
4 15     15   129 use strict;
  15         47  
  15         537  
5 15     15   108 use warnings;
  15         48  
  15         527  
6 15     15   100 no warnings qw( once void );
  15         44  
  15         2133  
7              
8             our $USES_MITE = "Mite::Role";
9             our $MITE_SHIM = "Mite::Shim";
10             our $MITE_VERSION = "0.011000";
11              
12             # Mite keywords
13             BEGIN {
14 15     15   95 my ( $SHIM, $CALLER ) =
15             ( "Mite::Shim", "Mite::Trait::HasRequiredMethods" );
16             (
17             *after, *around, *before,
18             *field, *has, *param,
19             *requires, *signature_for, *with
20             )
21 15         57 = do {
22              
23             package Mite::Shim;
24 15     15   110 no warnings 'redefine';
  15         45  
  15         3752  
25             (
26 0     0   0 sub { $SHIM->HANDLE_after( $CALLER, "role", @_ ) },
27 15     15   97 sub { $SHIM->HANDLE_around( $CALLER, "role", @_ ) },
28 15     15   124 sub { $SHIM->HANDLE_before( $CALLER, "role", @_ ) },
29 0     0   0 sub { $SHIM->HANDLE_has( $CALLER, field => @_ ) },
30 15     15   10649 sub { $SHIM->HANDLE_has( $CALLER, has => @_ ) },
31 0     0   0 sub { $SHIM->HANDLE_has( $CALLER, param => @_ ) },
32       0     sub { },
33 0     0   0 sub { $SHIM->HANDLE_signature_for( $CALLER, "role", @_ ) },
34 0     0   0 sub { $SHIM->HANDLE_with( $CALLER, @_ ) },
35 15         3019 );
36             };
37             }
38              
39             # Mite imports
40             BEGIN {
41 15     15   143 require Scalar::Util;
42 15         223 *STRICT = \&Mite::Shim::STRICT;
43 15         49 *bare = \&Mite::Shim::bare;
44 15         42 *blessed = \&Scalar::Util::blessed;
45 15         51 *carp = \&Mite::Shim::carp;
46 15         38 *confess = \&Mite::Shim::confess;
47 15         36 *croak = \&Mite::Shim::croak;
48 15         47 *false = \&Mite::Shim::false;
49 15         39 *guard = \&Mite::Shim::guard;
50 15         39 *lazy = \&Mite::Shim::lazy;
51 15         75 *lock = \&Mite::Shim::lock;
52 15         39 *ro = \&Mite::Shim::ro;
53 15         52 *rw = \&Mite::Shim::rw;
54 15         37 *rwp = \&Mite::Shim::rwp;
55 15         34 *true = \&Mite::Shim::true;
56 15         584 *unlock = \&Mite::Shim::unlock;
57             }
58              
59             # Gather metadata for constructor and destructor
60             sub __META__ {
61 15     15   113 no strict 'refs';
  15         52  
  15         7132  
62 0     0   0 my $class = shift;
63 0   0     0 $class = ref($class) || $class;
64 0         0 my $linear_isa = mro::get_linear_isa($class);
65             return {
66             BUILD => [
67 0 0       0 map { ( *{$_}{CODE} ) ? ( *{$_}{CODE} ) : () }
  0         0  
  0         0  
68 0         0 map { "$_\::BUILD" } reverse @$linear_isa
69             ],
70             DEMOLISH => [
71 0 0       0 map { ( *{$_}{CODE} ) ? ( *{$_}{CODE} ) : () }
  0         0  
  0         0  
72 0         0 map { "$_\::DEMOLISH" } @$linear_isa
  0         0  
73             ],
74             HAS_BUILDARGS => $class->can('BUILDARGS'),
75             HAS_FOREIGNBUILDARGS => $class->can('FOREIGNBUILDARGS'),
76             };
77             }
78              
79             # See UNIVERSAL
80             sub DOES {
81 0     0 0 0 my ( $self, $role ) = @_;
82 0         0 our %DOES;
83 0 0       0 return $DOES{$role} if exists $DOES{$role};
84 0 0       0 return 1 if $role eq __PACKAGE__;
85 0 0 0     0 if ( $INC{'Moose/Util.pm'}
      0        
86             and my $meta = Moose::Util::find_meta( ref $self or $self ) )
87             {
88 0 0 0     0 $meta->can('does_role') and $meta->does_role($role) and return 1;
89             }
90 0         0 return $self->SUPER::DOES($role);
91             }
92              
93             # Alias for Moose/Moo-compatibility
94             sub does {
95 0     0 0 0 shift->DOES(@_);
96             }
97              
98             # Callback which classes consuming this role will call
99             sub __FINALIZE_APPLICATION__ {
100 15     15   74 my ( $me, $target, $args ) = @_;
101 15         34 our ( %CONSUMERS, @METHOD_MODIFIERS );
102              
103             # Ensure a given target only consumes this role once.
104 15 50       90 if ( exists $CONSUMERS{$target} ) {
105 0         0 return;
106             }
107 15         48 $CONSUMERS{$target} = 1;
108              
109 15     15   127 my $type = do { no strict 'refs'; ${"$target\::USES_MITE"} };
  15         45  
  15         4366  
  15         36  
  15         34  
  15         87  
110 15 50       76 return if $type ne 'Mite::Class';
111              
112 15         36 my @missing_methods;
113 15 50       372 @missing_methods = grep( !$target->can($_),
114             "_compile_mop_required_methods",
115             "inject_mite_functions" )
116             and croak( "$me requires $target to implement methods: " . join q[, ],
117             @missing_methods );
118              
119 15         50 my @roles = ();
120 15 50       43 my %nextargs = %{ $args || {} };
  15         224  
121 15   50     141 ( $nextargs{-indirect} ||= 0 )++;
122 15 50       71 croak("PANIC!") if $nextargs{-indirect} > 100;
123 15         46 for my $role (@roles) {
124 0         0 $role->__FINALIZE_APPLICATION__( $target, {%nextargs} );
125             }
126              
127 15         37 my $shim = "Mite::Shim";
128 15         38 for my $modifier_rule (@METHOD_MODIFIERS) {
129 30         112 my ( $modification, $names, $coderef ) = @$modifier_rule;
130 30         86 my $handler = "HANDLE_$modification";
131 30         143 $shim->$handler( $target, "class", $names, $coderef );
132             }
133              
134 15         87 return;
135             }
136              
137             1;
138             }