22 if ($] >= 5.009_005) {
24 $impl = \&mro::get_linear_isa;
28 eval { require MRO::Compat };
32 $impl = \&mro::get_linear_isa;
34 # VVVVV CODE TAKEN FROM MRO::COMPAT VVVVV
35 my $_get_linear_isa_dfs; # this recurses so it isn't pretty
36 $_get_linear_isa_dfs = sub {
39 my $classname = shift;
41 my @lin = ($classname);
43 foreach my $parent (@{"$classname\::ISA"}) {
44 my $plin = $_get_linear_isa_dfs->($parent);
45 foreach my $p(@$plin) {
46 next if exists $stored{$p};
53 # ^^^^^ CODE TAKEN FROM MRO::COMPAT ^^^^^
54 $impl = $_get_linear_isa_dfs;
59 *{ __PACKAGE__ . '::get_linear_isa'} = $impl;
62 { # taken from Sub::Identify
63 sub get_code_info($) {
\r
65 ref($coderef) or return;
\r
66 my $cv = B::svref_2object($coderef);
\r
67 $cv->isa('B::CV') or return;
70 # bail out if GV is undefined
\r
71 $gv->isa('B::SPECIAL') and return;
\r
73 return ($gv->STASH->NAME, $gv->NAME);
\r
77 { # adapted from Class::MOP::Module
79 sub version { no strict 'refs'; ${shift->name.'::VERSION'} }
80 sub authority { no strict 'refs'; ${shift->name.'::AUTHORITY'} }
85 ($self->version || ()),
86 ($self->authority || ()),
91 # taken from Class/MOP.pm
95 sub resolve_metaclass_alias {
96 my ( $type, $metaclass_name, %options ) = @_;
98 my $cache_key = $type;
99 return $cache{$cache_key}{$metaclass_name}
100 if $cache{$cache_key}{$metaclass_name};
102 my $possible_full_name =
109 load_first_existing_class( $possible_full_name,
112 return $cache{$cache_key}{$metaclass_name} =
113 $loaded_class->can('register_implementation')
114 ? $loaded_class->register_implementation
119 # taken from Class/MOP.pm
120 sub _is_valid_class_name {
123 return 0 if ref($class);
124 return 0 unless defined($class);
125 return 0 unless length($class);
127 return 1 if $class =~ /^\w+(?:::\w+)*$/;
132 # taken from Class/MOP.pm
133 sub load_first_existing_class {
137 foreach my $class (@classes) {
138 unless ( _is_valid_class_name($class) ) {
139 my $display = defined($class) ? $class : 'undef';
140 confess "Invalid class name ($display)";
146 for my $class (@classes) {
147 my $e = _try_load_one_class($class);
150 $exceptions{$class} = $e;
157 return $found if $found;
162 sprintf( "Could not load class (%s) because : %s",
163 $_, $exceptions{$_} )
168 # taken from Class/MOP.pm
169 sub _try_load_one_class {
172 return if Mouse::is_class_loaded($class);
174 my $file = $class . '.pm';
179 eval { require($file) };
184 sub apply_all_roles {
185 my $meta = Mouse::Meta::Class->initialize(shift);
189 # Basis of Data::OptList
190 my $max = scalar(@_);
191 for (my $i = 0; $i < $max ; $i++) {
192 if ($i + 1 < $max && ref($_[$i + 1])) {
193 push @roles, [ $_[$i++] => $_[$i] ];
195 push @roles, [ $_[$i] => {} ];
199 foreach my $role_spec (@roles) {
200 Mouse::load_class( $role_spec->[0] );
203 ( $_->[0]->can('meta') && $_->[0]->meta->isa('Mouse::Meta::Role') )
204 || confess("You can only consume roles, "
206 . " is not a Moose role")
209 if ( scalar @roles == 1 ) {
210 my ( $role, $params ) = @{ $roles[0] };
211 $role->meta->apply( $meta, ( defined $params ? %$params : () ) );
214 Mouse::Meta::Role->combine_apply($meta, @roles);
225 Mouse::Util - features, with or without their dependencies
227 =head1 IMPLEMENTATIONS FOR
229 =head2 L<MRO::Compat>
231 =head3 get_linear_isa