File Coverage

blib/lib/Mite/Role.pm.mite.pm
Criterion Covered Total %
statement 180 262 68.7
branch 46 170 27.0
condition 7 45 15.5
subroutine 40 52 76.9
pod 0 16 0.0
total 273 545 50.0


line stmt bran cond sub pod time code
1             {
2              
3             package Mite::Role;
4 15     15   150 use strict;
  15         45  
  15         505  
5 15     15   79 use warnings;
  15         35  
  15         522  
6 15     15   80 no warnings qw( once void );
  15         37  
  15         1849  
7              
8             our $USES_MITE = "Mite::Class";
9             our $MITE_SHIM = "Mite::Shim";
10             our $MITE_VERSION = "0.011000";
11              
12             # Mite keywords
13             BEGIN {
14 15     15   82 my ( $SHIM, $CALLER ) = ( "Mite::Shim", "Mite::Role" );
15             (
16             *after, *around, *before, *extends, *field,
17             *has, *param, *signature_for, *with
18             )
19 15         40 = do {
20              
21             package Mite::Shim;
22 15     15   109 no warnings 'redefine';
  15         37  
  15         3689  
23             (
24 0     0   0 sub { $SHIM->HANDLE_after( $CALLER, "class", @_ ) },
25 15     15   83 sub { $SHIM->HANDLE_around( $CALLER, "class", @_ ) },
26 0     0   0 sub { $SHIM->HANDLE_before( $CALLER, "class", @_ ) },
27       15     sub { },
28 0     0   0 sub { $SHIM->HANDLE_has( $CALLER, field => @_ ) },
29 0     0   0 sub { $SHIM->HANDLE_has( $CALLER, has => @_ ) },
30 0     0   0 sub { $SHIM->HANDLE_has( $CALLER, param => @_ ) },
31 0     0   0 sub { $SHIM->HANDLE_signature_for( $CALLER, "class", @_ ) },
32 15     15   151 sub { $SHIM->HANDLE_with( $CALLER, @_ ) },
33 15         2950 );
34             };
35             }
36              
37             # Mite imports
38             BEGIN {
39 15     15   113 require Scalar::Util;
40 15         56 *STRICT = \&Mite::Shim::STRICT;
41 15         46 *bare = \&Mite::Shim::bare;
42 15         50 *blessed = \&Scalar::Util::blessed;
43 15         38 *carp = \&Mite::Shim::carp;
44 15         39 *confess = \&Mite::Shim::confess;
45 15         35 *croak = \&Mite::Shim::croak;
46 15         33 *false = \&Mite::Shim::false;
47 15         33 *guard = \&Mite::Shim::guard;
48 15         38 *lazy = \&Mite::Shim::lazy;
49 15         30 *lock = \&Mite::Shim::lock;
50 15         34 *ro = \&Mite::Shim::ro;
51 15         31 *rw = \&Mite::Shim::rw;
52 15         31 *rwp = \&Mite::Shim::rwp;
53 15         33 *true = \&Mite::Shim::true;
54 15         741 *unlock = \&Mite::Shim::unlock;
55             }
56              
57             BEGIN {
58 15     15   715 require Mite::Package;
59              
60 15     15   106 use mro 'c3';
  15         44  
  15         127  
61 15         35 our @ISA;
62 15         17197 push @ISA, "Mite::Package";
63             }
64              
65             # Standard Moose/Moo-style constructor
66             sub new {
67 12 50   12 0 55 my $class = ref( $_[0] ) ? ref(shift) : shift;
68 12   66     169 my $meta = ( $Mite::META{$class} ||= $class->__META__ );
69 12         58 my $self = bless {}, $class;
70             my $args =
71             $meta->{HAS_BUILDARGS}
72             ? $class->BUILDARGS(@_)
73 12 50       98 : { ( @_ == 1 ) ? %{ $_[0] } : @_ };
  0 50       0  
74 12         30 my $no_build = delete $args->{__no_BUILD__};
75              
76             # Attribute name (type: ValidClassName)
77             # has declaration, file lib/Mite/Package.pm, line 11
78 12 50       50 croak "Missing key in constructor: name" unless exists $args->{"name"};
79             (
80             (
81             do {
82              
83             package Mite::Shim;
84 12 50       53 defined( $args->{"name"} ) and do {
85             ref( \$args->{"name"} ) eq 'SCALAR'
86 12 50       101 or ref( \( my $val = $args->{"name"} ) ) eq 'SCALAR';
87             }
88             }
89             )
90             && (
91 12 50 33     23 do {
92 12         33 local $_ = $args->{"name"};
93 12         132 /\A[^\W0-9]\w*(?:::[^\W0-9]\w*)*\z/;
94             }
95             )
96             )
97             or croak "Type check failed in constructor: %s should be %s", "name",
98             "ValidClassName";
99 12         87 $self->{"name"} = $args->{"name"};
100              
101             # Attribute shim_name (type: ValidClassName)
102             # has declaration, file lib/Mite/Package.pm, line 23
103 12 50       67 if ( exists $args->{"shim_name"} ) {
104             (
105             (
106             do {
107              
108             package Mite::Shim;
109 0 0       0 defined( $args->{"shim_name"} ) and do {
110             ref( \$args->{"shim_name"} ) eq 'SCALAR'
111 0 0       0 or ref( \( my $val = $args->{"shim_name"} ) ) eq
112             'SCALAR';
113             }
114             }
115             )
116             && (
117 0 0 0     0 do {
118 0         0 local $_ = $args->{"shim_name"};
119 0         0 /\A[^\W0-9]\w*(?:::[^\W0-9]\w*)*\z/;
120             }
121             )
122             )
123             or croak "Type check failed in constructor: %s should be %s",
124             "shim_name", "ValidClassName";
125 0         0 $self->{"shim_name"} = $args->{"shim_name"};
126             }
127              
128             # Attribute source (type: Mite::Source)
129             # has declaration, file lib/Mite/Package.pm, line 25
130 12 100       46 if ( exists $args->{"source"} ) {
131             blessed( $args->{"source"} )
132 10 50 33     255 && $args->{"source"}->isa("Mite::Source")
133             or croak "Type check failed in constructor: %s should be %s",
134             "source", "Mite::Source";
135 10         42 $self->{"source"} = $args->{"source"};
136             }
137             require Scalar::Util && Scalar::Util::weaken( $self->{"source"} )
138 12 100 33     135 if ref $self->{"source"};
139              
140             # Attribute imported_functions (type: Map[MethodName,Str])
141             # has declaration, file lib/Mite/Package.pm, line 34
142 12         21 do {
143             my $value =
144             exists( $args->{"imported_functions"} )
145 12 50       168 ? $args->{"imported_functions"}
146             : $self->_build_imported_functions;
147 12 50       29 do {
148              
149             package Mite::Shim;
150 12 50       60 ( ref($value) eq 'HASH' ) and do {
151 12         26 my $ok = 1;
152 12         25 for my $v ( values %{$value} ) {
  12         58  
153 0 0       0 ( $ok = 0, last ) unless do {
154              
155             package Mite::Shim;
156 0 0       0 defined($v) and do {
157 0 0       0 ref( \$v ) eq 'SCALAR'
158             or ref( \( my $val = $v ) ) eq 'SCALAR';
159             }
160             }
161             };
162 12         23 for my $k ( keys %{$value} ) {
  12         42  
163             ( $ok = 0, last )
164             unless (
165             (
166             do {
167              
168             package Mite::Shim;
169 0 0       0 defined($k) and do {
170 0 0       0 ref( \$k ) eq 'SCALAR'
171             or ref( \( my $val = $k ) ) eq
172             'SCALAR';
173             }
174             }
175             )
176 0 0 0     0 && ( do { local $_ = $k; /\A[^\W0-9]\w*\z/ } )
  0         0  
  0         0  
177             );
178             };
179 12         63 $ok;
180             }
181             }
182             or croak "Type check failed in constructor: %s should be %s",
183             "imported_functions", "Map[MethodName,Str]";
184 12         37 $self->{"imported_functions"} = $value;
185             };
186              
187             # Attribute imported_keywords (type: Map[MethodName,Str])
188             # has declaration, file lib/Mite/Package.pm, line 39
189 12         28 do {
190             my $value =
191             exists( $args->{"imported_keywords"} )
192 12 50       136 ? $args->{"imported_keywords"}
193             : $self->_build_imported_keywords;
194 12 50       25 do {
195              
196             package Mite::Shim;
197 12 50       58 ( ref($value) eq 'HASH' ) and do {
198 12         39 my $ok = 1;
199 12         27 for my $v ( values %{$value} ) {
  12         40  
200 0 0       0 ( $ok = 0, last ) unless do {
201              
202             package Mite::Shim;
203 0 0       0 defined($v) and do {
204 0 0       0 ref( \$v ) eq 'SCALAR'
205             or ref( \( my $val = $v ) ) eq 'SCALAR';
206             }
207             }
208             };
209 12         29 for my $k ( keys %{$value} ) {
  12         39  
210             ( $ok = 0, last )
211             unless (
212             (
213             do {
214              
215             package Mite::Shim;
216 0 0       0 defined($k) and do {
217 0 0       0 ref( \$k ) eq 'SCALAR'
218             or ref( \( my $val = $k ) ) eq
219             'SCALAR';
220             }
221             }
222             )
223 0 0 0     0 && ( do { local $_ = $k; /\A[^\W0-9]\w*\z/ } )
  0         0  
  0         0  
224             );
225             };
226 12         46 $ok;
227             }
228             }
229             or croak "Type check failed in constructor: %s should be %s",
230             "imported_keywords", "Map[MethodName,Str]";
231 12         44 $self->{"imported_keywords"} = $value;
232             };
233              
234             # Attribute arg
235             # has declaration, file lib/Mite/Package.pm, line 41
236 12 50       67 $self->{"arg"} = ( exists( $args->{"arg"} ) ? $args->{"arg"} : {} );
237              
238             # Attribute attributes (type: HashRef[Mite::Attribute])
239             # has declaration, file lib/Mite/Trait/HasAttributes.pm, line 16
240 12         37 do {
241             my $value =
242             exists( $args->{"attributes"} )
243 12 100       104 ? $args->{"attributes"}
244             : $Mite::Trait::HasAttributes::__attributes_DEFAULT__
245             ->($self);
246 12 50       22 do {
247              
248             package Mite::Shim;
249 12 50       87 ( ref($value) eq 'HASH' ) and do {
250 12         24 my $ok = 1;
251 12         26 for my $i ( values %{$value} ) {
  12         43  
252             ( $ok = 0, last )
253             unless (
254 0 0       0 do {
255 15     15   128 use Scalar::Util ();
  15         37  
  15         1738  
256 0 0       0 Scalar::Util::blessed($i)
257             and $i->isa(q[Mite::Attribute]);
258             }
259             );
260             };
261 12         82 $ok;
262             }
263             }
264             or croak "Type check failed in constructor: %s should be %s",
265             "attributes", "HashRef[Mite::Attribute]";
266 12         52 $self->{"attributes"} = $value;
267             };
268              
269             # Attribute roles (type: ArrayRef[Mite::Role])
270             # has declaration, file lib/Mite/Trait/HasRoles.pm, line 19
271 12         38 do {
272             my $value =
273             exists( $args->{"roles"} )
274 12 100       72 ? $args->{"roles"}
275             : $self->_build_roles;
276 12 50       21 do {
277              
278             package Mite::Shim;
279 12 50       57 ( ref($value) eq 'ARRAY' ) and do {
280 12         34 my $ok = 1;
281 12         33 for my $i ( @{$value} ) {
  12         44  
282             ( $ok = 0, last )
283             unless (
284 0 0       0 do {
285 15     15   99 use Scalar::Util ();
  15         39  
  15         4249  
286 0 0       0 Scalar::Util::blessed($i)
287             and $i->isa(q[Mite::Role]);
288             }
289             );
290             };
291 12         72 $ok;
292             }
293             }
294             or croak "Type check failed in constructor: %s should be %s",
295             "roles", "ArrayRef[Mite::Role]";
296 12         34 $self->{"roles"} = $value;
297             };
298              
299             # Attribute role_args (type: Map[NonEmptyStr,HashRef|Undef])
300             # has declaration, file lib/Mite/Trait/HasRoles.pm, line 24
301 12         38 do {
302             my $value =
303             exists( $args->{"role_args"} )
304 12 50       80 ? $args->{"role_args"}
305             : $self->_build_role_args;
306 12 50       23 do {
307              
308             package Mite::Shim;
309 12 50       65 ( ref($value) eq 'HASH' ) and do {
310 12         20 my $ok = 1;
311 12         31 for my $v ( values %{$value} ) {
  12         46  
312 0 0       0 ( $ok = 0, last ) unless do {
313              
314             package Mite::Shim;
315 0 0       0 ( ( ref($v) eq 'HASH' ) or ( !defined($v) ) );
316             }
317             };
318 12         33 for my $k ( keys %{$value} ) {
  12         45  
319             ( $ok = 0, last )
320             unless (
321             (
322 0 0 0     0 do {
323              
324             package Mite::Shim;
325 0 0       0 defined($k) and do {
326 0 0       0 ref( \$k ) eq 'SCALAR'
327             or ref( \( my $val = $k ) ) eq
328             'SCALAR';
329             }
330             }
331             )
332             && ( length($k) > 0 )
333             );
334             };
335 12         51 $ok;
336             }
337             }
338             or croak "Type check failed in constructor: %s should be %s",
339             "role_args", "Map[NonEmptyStr,HashRef|Undef]";
340 12         41 $self->{"role_args"} = $value;
341             };
342              
343             # Attribute method_signatures (type: Map[MethodName,Mite::Signature])
344             # has declaration, file lib/Mite/Trait/HasMethods.pm, line 20
345 12         32 do {
346             my $value =
347             exists( $args->{"method_signatures"} )
348 12 50       80 ? $args->{"method_signatures"}
349             : $self->_build_method_signatures;
350 12 50       22 do {
351              
352             package Mite::Shim;
353 12 50       85 ( ref($value) eq 'HASH' ) and do {
354 12         25 my $ok = 1;
355 12         26 for my $v ( values %{$value} ) {
  12         33  
356             ( $ok = 0, last )
357             unless (
358 0 0       0 do {
359 15     15   118 use Scalar::Util ();
  15         38  
  15         18834  
360 0 0       0 Scalar::Util::blessed($v)
361             and $v->isa(q[Mite::Signature]);
362             }
363             );
364             };
365 12         26 for my $k ( keys %{$value} ) {
  12         32  
366             ( $ok = 0, last )
367             unless (
368             (
369             do {
370              
371             package Mite::Shim;
372 0 0       0 defined($k) and do {
373 0 0       0 ref( \$k ) eq 'SCALAR'
374             or ref( \( my $val = $k ) ) eq
375             'SCALAR';
376             }
377             }
378             )
379 0 0 0     0 && ( do { local $_ = $k; /\A[^\W0-9]\w*\z/ } )
  0         0  
  0         0  
380             );
381             };
382 12         52 $ok;
383             }
384             }
385             or croak "Type check failed in constructor: %s should be %s",
386             "method_signatures", "Map[MethodName,Mite::Signature]";
387 12         28 $self->{"method_signatures"} = $value;
388             };
389              
390             # Attribute required_methods (type: ArrayRef[MethodName])
391             # has declaration, file lib/Mite/Trait/HasRequiredMethods.pm, line 14
392 12         24 do {
393             my $value =
394             exists( $args->{"required_methods"} )
395 12 100       75 ? $args->{"required_methods"}
396             : $self->_build_required_methods;
397 12 50       51 do {
398              
399             package Mite::Shim;
400 12 50       97 ( ref($value) eq 'ARRAY' ) and do {
401 12         28 my $ok = 1;
402 12         28 for my $i ( @{$value} ) {
  12         32  
403             ( $ok = 0, last )
404             unless (
405             (
406             do {
407              
408             package Mite::Shim;
409 1 50       4 defined($i) and do {
410 1 50       7 ref( \$i ) eq 'SCALAR'
411             or ref( \( my $val = $i ) ) eq
412             'SCALAR';
413             }
414             }
415             )
416 1 50 33     2 && ( do { local $_ = $i; /\A[^\W0-9]\w*\z/ } )
  1         11  
  1         9  
417             );
418             };
419 12         56 $ok;
420             }
421             }
422             or croak "Type check failed in constructor: %s should be %s",
423             "required_methods", "ArrayRef[MethodName]";
424 12         45 $self->{"required_methods"} = $value;
425             };
426              
427             # Call BUILD methods
428 12 50 33     64 $self->BUILDALL($args) if ( !$no_build and @{ $meta->{BUILD} || [] } );
  12 50       273  
429              
430             # Unrecognized parameters
431             my @unknown = grep not(
432             /\A(?:a(?:rg|ttributes)|imported_(?:functions|keywords)|method_signatures|name|r(?:equired_methods|ole(?:_args|s))|s(?:him_name|ource))\z/
433 12         36 ), keys %{$args};
  12         141  
434             @unknown
435 12 50       59 and croak(
436             "Unexpected keys in constructor: " . join( q[, ], sort @unknown ) );
437              
438 12         113 return $self;
439             }
440              
441             my $__XS = !$ENV{PERL_ONLY}
442             && eval { require Class::XSAccessor; Class::XSAccessor->VERSION("1.19") };
443              
444             # Accessors for attributes
445             # has declaration, file lib/Mite/Trait/HasAttributes.pm, line 16
446             if ($__XS) {
447             Class::XSAccessor->import(
448             chained => 1,
449             "getters" => { "attributes" => "attributes" },
450             );
451             }
452             else {
453             *attributes = sub {
454             @_ == 1 or croak('Reader "attributes" usage: $self->attributes()');
455             $_[0]{"attributes"};
456             };
457             }
458              
459             # Accessors for method_signatures
460             # has declaration, file lib/Mite/Trait/HasMethods.pm, line 20
461             if ($__XS) {
462             Class::XSAccessor->import(
463             chained => 1,
464             "getters" => { "method_signatures" => "method_signatures" },
465             );
466             }
467             else {
468             *method_signatures = sub {
469             @_ == 1
470             or croak(
471             'Reader "method_signatures" usage: $self->method_signatures()');
472             $_[0]{"method_signatures"};
473             };
474             }
475              
476             # Accessors for required_methods
477             # has declaration, file lib/Mite/Trait/HasRequiredMethods.pm, line 14
478             if ($__XS) {
479             Class::XSAccessor->import(
480             chained => 1,
481             "getters" => { "required_methods" => "required_methods" },
482             );
483             }
484             else {
485             *required_methods = sub {
486             @_ == 1
487             or croak(
488             'Reader "required_methods" usage: $self->required_methods()');
489             $_[0]{"required_methods"};
490             };
491             }
492              
493             # Accessors for role_args
494             # has declaration, file lib/Mite/Trait/HasRoles.pm, line 24
495             sub role_args {
496             @_ > 1
497             ? do {
498 0 0       0 do {
499              
500             package Mite::Shim;
501 0 0       0 ( ref( $_[1] ) eq 'HASH' ) and do {
502 0         0 my $ok = 1;
503 0         0 for my $v ( values %{ $_[1] } ) {
  0         0  
504 0 0       0 ( $ok = 0, last ) unless do {
505              
506             package Mite::Shim;
507 0 0       0 ( ( ref($v) eq 'HASH' ) or ( !defined($v) ) );
508             }
509             };
510 0         0 for my $k ( keys %{ $_[1] } ) {
  0         0  
511             ( $ok = 0, last )
512             unless (
513             (
514 0 0 0     0 do {
515              
516             package Mite::Shim;
517 0 0       0 defined($k) and do {
518 0 0       0 ref( \$k ) eq 'SCALAR'
519             or ref( \( my $val = $k ) ) eq
520             'SCALAR';
521             }
522             }
523             )
524             && ( length($k) > 0 )
525             );
526             };
527 0         0 $ok;
528             }
529             }
530             or croak( "Type check failed in %s: value should be %s",
531             "accessor", "Map[NonEmptyStr,HashRef|Undef]" );
532 0         0 $_[0]{"role_args"} = $_[1];
533 0         0 $_[0];
534             }
535 8 50   8 0 64 : ( $_[0]{"role_args"} );
536             }
537              
538             # Accessors for roles
539             # has declaration, file lib/Mite/Trait/HasRoles.pm, line 19
540             sub roles {
541             @_ > 1
542             ? do {
543 0 0       0 do {
544              
545             package Mite::Shim;
546 0 0       0 ( ref( $_[1] ) eq 'ARRAY' ) and do {
547 0         0 my $ok = 1;
548 0         0 for my $i ( @{ $_[1] } ) {
  0         0  
549             ( $ok = 0, last )
550             unless (
551 0 0       0 do {
552 15     15   138 use Scalar::Util ();
  15         73  
  15         3084  
553 0 0       0 Scalar::Util::blessed($i)
554             and $i->isa(q[Mite::Role]);
555             }
556             );
557             };
558 0         0 $ok;
559             }
560             }
561             or croak( "Type check failed in %s: value should be %s",
562             "accessor", "ArrayRef[Mite::Role]" );
563 0         0 $_[0]{"roles"} = $_[1];
564 0         0 $_[0];
565             }
566 59 50   59 0 445 : ( $_[0]{"roles"} );
567             }
568              
569             BEGIN {
570 15     15   6743 require Mite::Trait::HasRequiredMethods;
571 15         128 require Mite::Trait::HasAttributes;
572 15         65 require Mite::Trait::HasRoles;
573 15         87 require Mite::Trait::HasMethods;
574 15         60 require Mite::Trait::HasMOP;
575              
576 15         13922 our %DOES = (
577             "Mite::Role" => 1,
578             "Mite::Trait::HasRequiredMethods" => 1,
579             "Mite::Trait::HasAttributes" => 1,
580             "Mite::Trait::HasRoles" => 1,
581             "Mite::Trait::HasMethods" => 1,
582             "Mite::Trait::HasMOP" => 1
583             );
584             }
585              
586             # See UNIVERSAL
587             sub DOES {
588 0     0 0 0 my ( $self, $role ) = @_;
589 0         0 our %DOES;
590 0 0       0 return $DOES{$role} if exists $DOES{$role};
591 0 0       0 return 1 if $role eq __PACKAGE__;
592 0 0 0     0 if ( $INC{'Moose/Util.pm'}
      0        
593             and my $meta = Moose::Util::find_meta( ref $self or $self ) )
594             {
595 0 0 0     0 $meta->can('does_role') and $meta->does_role($role) and return 1;
596             }
597 0         0 return $self->SUPER::DOES($role);
598             }
599              
600             # Alias for Moose/Moo-compatibility
601             sub does {
602 0     0 0 0 shift->DOES(@_);
603             }
604              
605             # Methods from roles
606 34     34   102 sub _all_subs { goto \&Mite::Trait::HasMethods::_all_subs; }
607              
608             sub _build_method_signatures {
609 12     12   69 goto \&Mite::Trait::HasMethods::_build_method_signatures;
610             }
611              
612             sub _build_required_methods {
613             goto
614 10     10   45 \&Mite::Trait::HasRequiredMethods::_build_required_methods;
615             }
616              
617             sub _build_role_args {
618 12     12   79 goto \&Mite::Trait::HasRoles::_build_role_args;
619             }
620 10     10   68 sub _build_roles { goto \&Mite::Trait::HasRoles::_build_roles; }
621              
622             sub _compile_attribute_accessors {
623             goto
624 1     1   6 \&Mite::Trait::HasAttributes::_compile_attribute_accessors;
625             }
626              
627             sub _compile_composed_methods {
628 10     10   44 goto \&Mite::Trait::HasRoles::_compile_composed_methods;
629             }
630 10     10   44 sub _compile_does { goto \&Mite::Trait::HasRoles::_compile_does; }
631              
632             sub _compile_init_attributes {
633 0     0   0 goto \&Mite::Trait::HasAttributes::_compile_init_attributes;
634             }
635              
636             sub _compile_method_signatures {
637 10     10   48 goto \&Mite::Trait::HasMethods::_compile_method_signatures;
638             }
639 0     0   0 sub _compile_mop { goto \&Mite::Trait::HasMOP::_compile_mop; }
640              
641             sub _compile_mop_attributes {
642             goto \&Mite::Trait::HasMOP::_compile_mop_attributes;
643             }
644              
645             sub _compile_mop_methods {
646 0     0   0 goto \&Mite::Trait::HasMOP::_compile_mop_methods;
647             }
648              
649             sub _compile_mop_postamble {
650             goto \&Mite::Trait::HasMOP::_compile_mop_postamble;
651             }
652              
653             sub _compile_mop_required_methods {
654             goto \&Mite::Trait::HasMOP::_compile_mop_required_methods;
655             }
656 10     10   61 sub _compile_with { goto \&Mite::Trait::HasRoles::_compile_with; }
657 2     2   8 sub _get_role { goto \&Mite::Trait::HasRoles::_get_role; }
658              
659             sub add_attribute {
660 11     11 0 56 goto \&Mite::Trait::HasAttributes::add_attribute;
661             }
662              
663             sub add_attributes {
664             goto \&Mite::Trait::HasAttributes::add_attributes;
665             }
666              
667             sub add_method_signature {
668 1     1 0 5 goto \&Mite::Trait::HasMethods::add_method_signature;
669             }
670              
671             sub add_required_methods {
672 2     2 0 12 goto \&Mite::Trait::HasRequiredMethods::add_required_methods;
673             }
674 2     2 0 9 sub add_role { goto \&Mite::Trait::HasRoles::add_role; }
675              
676             sub add_roles_by_name {
677 2     2 0 9 goto \&Mite::Trait::HasRoles::add_roles_by_name;
678             }
679              
680             sub all_attributes {
681 10     10 0 66 goto \&Mite::Trait::HasAttributes::all_attributes;
682             }
683 15     15 0 83 sub does_list { goto \&Mite::Trait::HasRoles::does_list; }
684              
685             sub extend_attribute {
686 0     0 0 0 goto \&Mite::Trait::HasAttributes::extend_attribute;
687             }
688              
689             sub handle_with_keyword {
690 2     2 0 22 goto \&Mite::Trait::HasRoles::handle_with_keyword;
691             }
692              
693             sub methods_to_import_from_roles {
694 22     22 0 123 goto \&Mite::Trait::HasRoles::methods_to_import_from_roles;
695             }
696              
697             sub native_methods {
698 34     34 0 110 goto \&Mite::Trait::HasMethods::native_methods;
699             }
700              
701             1;
702             }