Comments, style
[gitmo/Mouse.git] / lib / Mouse / Util.pm
1 package Mouse::Util;
2 use strict;
3 use warnings;
4 use base qw/Exporter/;
5 use Carp;
6
7 our @EXPORT_OK = qw(
8     get_linear_isa
9 );
10 our %EXPORT_TAGS = (
11     all  => \@EXPORT_OK,
12 );
13
14 BEGIN {
15     my $impl;
16     if ($] >= 5.009_005) {
17         $impl = \&mro::get_linear_isa;
18     } else {
19         my $loaded = do {
20             local $SIG{__DIE__} = 'DEFAULT';
21             eval "require MRO::Compat; 1";
22         };
23         if ($loaded) {
24             $impl = \&mro::get_linear_isa;
25         } else {
26 #       VVVVV   CODE TAKEN FROM MRO::COMPAT   VVVVV
27             my $code; # this recurses so it isn't pretty
28             $code = sub {
29                 no strict 'refs';
30
31                 my $classname = shift;
32
33                 my @lin = ($classname);
34                 my %stored;
35                 foreach my $parent (@{"$classname\::ISA"}) {
36                     my $plin = $code->($parent);
37                     foreach (@$plin) {
38                         next if exists $stored{$_};
39                         push(@lin, $_);
40                         $stored{$_} = 1;
41                     }
42                 }
43                 return \@lin;
44             };
45 #       ^^^^^   CODE TAKEN FROM MRO::COMPAT   ^^^^^
46             $impl = $code;
47         }
48     }
49
50     no strict 'refs';
51     *{ __PACKAGE__ . '::get_linear_isa'} = $impl;
52 }
53
54 sub apply_all_roles {
55     my $meta = Mouse::Meta::Class->initialize(shift);
56
57     my @roles;
58
59     # Basis of Data::OptList
60     my $max = scalar(@_);
61     for (my $i = 0; $i < $max ; $i++) {
62         if ($i + 1 < $max && ref($_[$i + 1])) {
63             push @roles, [ $_[$i++] => $_[$i] ];
64         } else {
65             push @roles, [ $_[$i] => {} ];
66         }
67     }
68
69     foreach my $role_spec (@roles) {
70         Mouse::load_class( $role_spec->[0] );
71     }
72
73     ( $_->[0]->can('meta') && $_->[0]->meta->isa('Mouse::Meta::Role') )
74         || croak("You can only consume roles, "
75         . $_->[0]
76         . " is not a Moose role")
77         foreach @roles;
78
79     if ( scalar @roles == 1 ) {
80         my ( $role, $params ) = @{ $roles[0] };
81         $role->meta->apply( $meta, ( defined $params ? %$params : () ) );
82     }
83     else {
84         Mouse::Meta::Role->combine_apply($meta, @roles);
85     }
86
87 }
88
89 1;
90
91 __END__
92
93 =head1 NAME
94
95 Mouse::Util - features, with or without their dependencies
96
97 =head1 IMPLEMENTATIONS FOR
98
99 =head2 L<MRO::Compat>
100
101 =head3 get_linear_isa
102
103 =cut
104