package Mouse::Util;
-use strict;
-use warnings;
-
-use Exporter;
+use Mouse::Exporter; # enables strict and warnings
use Carp qw(confess);
use B ();
use constant _MOUSE_VERBOSE => !!$ENV{MOUSE_VERBOSE};
-our @ISA = qw(Exporter);
-our @EXPORT_OK = qw(
- find_meta
- does_role
- resolve_metaclass_alias
- apply_all_roles
- english_list
+Mouse::Exporter->setup_import_methods(
+ as_is => [qw(
+ find_meta
+ does_role
+ resolve_metaclass_alias
+ apply_all_roles
+ english_list
- load_class
- is_class_loaded
+ load_class
+ is_class_loaded
- get_linear_isa
- get_code_info
+ get_linear_isa
+ get_code_info
- get_code_package
+ get_code_package
- not_supported
+ not_supported
- does meta dump
- _MOUSE_VERBOSE
-);
-our %EXPORT_TAGS = (
- all => \@EXPORT_OK,
- meta => [qw(does meta dump _MOUSE_VERBOSE)],
+ does meta dump
+ _MOUSE_VERBOSE
+ )],
+ groups => {
+ default => [], # export no functions by default
+ meta => [qw(does meta dump _MOUSE_VERBOSE)],
+ },
+ _export_to_main => 1,
);
# aliases as public APIs
+# it must be 'require', not 'use', because Mouse::Meta::Module depends on Mouse::Util
+require Mouse::Meta::Module; # for the entities of metaclass cache utilities
-BEGIN{
+BEGIN {
*class_of = \&Mouse::Meta::Module::class_of;
*get_metaclass_by_name = \&Mouse::Meta::Module::get_metaclass_by_name;
*get_all_metaclass_instances = \&Mouse::Meta::Module::get_all_metaclass_instances;
}
# taken from Class/MOP.pm
+my %is_class_loaded_cache;
sub _try_load_one_class {
my $class = shift;
confess "Invalid class name ($display)";
}
- return if is_class_loaded($class);
+ return undef if $is_class_loaded_cache{$class} ||= is_class_loaded($class);
my $file = $class . '.pm';
$file =~ s{::}{/}g;
return 1;
}
-my %is_class_loaded_cache;
+
sub is_class_loaded {
my $class = shift;
return 0 if ref($class) || !defined($class) || !length($class);
- return 1 if $is_class_loaded_cache{$class};
-
# walk the symbol table tree to avoid autovififying
# \*{${main::}{"Foo::"}} == \*main::Foo::
}
# check for $VERSION or @ISA
- return ++$is_class_loaded_cache{$class} if exists $pack->{VERSION}
+ return 1 if exists $pack->{VERSION}
&& defined *{$pack->{VERSION}}{SCALAR} && defined ${ $pack->{VERSION} };
- return ++$is_class_loaded_cache{$class} if exists $pack->{ISA}
+ return 1 if exists $pack->{ISA}
&& defined *{$pack->{ISA}}{ARRAY} && @{ $pack->{ISA} } != 0;
# check for any method
foreach my $name( keys %{$pack} ) {
my $entry = \$pack->{$name};
- return ++$is_class_loaded_cache{$class} if ref($entry) ne 'GLOB' || defined *{$entry}{CODE};
+ return 1 if ref($entry) ne 'GLOB' || defined *{$entry}{CODE};
}
# fail
}
sub meta{
- return Mouse::Meta::Class->initialize($_[0]);
+ return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
}
sub dump {
This function can be used in place of tricks like
C<eval "use $module"> or using C<require>.
-=head2 C<< Mouse::Util::class_of(ClassName) >>
+=head3 C<< Mouse::Util::class_of(ClassName or Object) >>
-The counterpart of C<Class::MOP::class_of()>. This is not exportable.
+=head3 C<< Mouse::Util::get_metaclass_by_name(ClassName) >>
-=head2 C<< Mouse::Util::get_metaclass_by_name(ClassName) >>
+=head3 C<< Mouse::Util::get_all_metaclass_instances() >>
-The counterpart of C<Class::MOP::get_metaclass_by_name()>. This is not exportable.
+=head3 C<< Mouse::Util::get_all_metaclass_names() >>
=head2 MRO::Compat
L<Moose::Util>
-L<Scalar::Util>
+L<Class::MOP>
L<Sub::Identify>