20 if ($] >= 5.009_005) {
22 $impl = \&mro::get_linear_isa;
25 local $SIG{__DIE__} = 'DEFAULT';
26 eval { require MRO::Compat; 1 };
29 $impl = \&mro::get_linear_isa;
31 # VVVVV CODE TAKEN FROM MRO::COMPAT VVVVV
32 my $code; # this recurses so it isn't pretty
36 my $classname = shift;
38 my @lin = ($classname);
40 foreach my $parent (@{"$classname\::ISA"}) {
41 my $plin = $code->($parent);
43 next if exists $stored{$_};
50 # ^^^^^ CODE TAKEN FROM MRO::COMPAT ^^^^^
56 *{ __PACKAGE__ . '::get_linear_isa'} = $impl;
59 { # adapted from Class::MOP::Module
61 sub version { no strict 'refs'; ${shift->name.'::VERSION'} }
62 sub authority { no strict 'refs'; ${shift->name.'::AUTHORITY'} }
67 ($self->version || ()),
68 ($self->authority || ()),
73 # taken from Class/MOP.pm
77 sub resolve_metaclass_alias {
78 my ( $type, $metaclass_name, %options ) = @_;
80 my $cache_key = $type;
81 return $cache{$cache_key}{$metaclass_name}
82 if $cache{$cache_key}{$metaclass_name};
84 my $possible_full_name =
91 load_first_existing_class( $possible_full_name,
94 return $cache{$cache_key}{$metaclass_name} =
95 $loaded_class->can('register_implementation')
96 ? $loaded_class->register_implementation
101 # taken from Class/MOP.pm
102 sub _is_valid_class_name {
105 return 0 if ref($class);
106 return 0 unless defined($class);
107 return 0 unless length($class);
109 return 1 if $class =~ /^\w+(?:::\w+)*$/;
114 # taken from Class/MOP.pm
115 sub load_first_existing_class {
119 foreach my $class (@classes) {
120 unless ( _is_valid_class_name($class) ) {
121 my $display = defined($class) ? $class : 'undef';
122 confess "Invalid class name ($display)";
128 for my $class (@classes) {
129 my $e = _try_load_one_class($class);
132 $exceptions{$class} = $e;
139 return $found if $found;
144 sprintf( "Could not load class (%s) because : %s",
145 $_, $exceptions{$_} )
150 # taken from Class/MOP.pm
151 sub _try_load_one_class {
154 return if Mouse::is_class_loaded($class);
156 my $file = $class . '.pm';
161 eval { require($file) };
166 sub apply_all_roles {
167 my $meta = Mouse::Meta::Class->initialize(shift);
171 # Basis of Data::OptList
172 my $max = scalar(@_);
173 for (my $i = 0; $i < $max ; $i++) {
174 if ($i + 1 < $max && ref($_[$i + 1])) {
175 push @roles, [ $_[$i++] => $_[$i] ];
177 push @roles, [ $_[$i] => {} ];
181 foreach my $role_spec (@roles) {
182 Mouse::load_class( $role_spec->[0] );
185 ( $_->[0]->can('meta') && $_->[0]->meta->isa('Mouse::Meta::Role') )
186 || croak("You can only consume roles, "
188 . " is not a Moose role")
191 if ( scalar @roles == 1 ) {
192 my ( $role, $params ) = @{ $roles[0] };
193 $role->meta->apply( $meta, ( defined $params ? %$params : () ) );
196 Mouse::Meta::Role->combine_apply($meta, @roles);
207 Mouse::Util - features, with or without their dependencies
209 =head1 IMPLEMENTATIONS FOR
211 =head2 L<MRO::Compat>
213 =head3 get_linear_isa