use 5.006;
use base 'Exporter';
-our $VERSION = '0.27';
+our $VERSION = '0.30';
use Carp 'confess';
use Scalar::Util 'blessed';
our @EXPORT = qw(extends has before after around override super blessed confess with);
+our %is_removable = map{ $_ => undef } @EXPORT;
+delete $is_removable{blessed};
+delete $is_removable{confess};
+
sub extends { Mouse::Meta::Class->initialize(caller)->superclasses(@_) }
sub has {
$meta->superclasses($base_class)
unless $meta->superclasses;
- {
- no strict 'refs';
- no warnings 'redefine';
- *{$class.'::meta'} = sub { $meta };
- }
+ $meta->add_method(meta => sub{
+ return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
+ });
+
return $meta;
}
sub unimport {
my $caller = caller;
- no strict 'refs';
+ my $stash = do{
+ no strict 'refs';
+ \%{$caller . '::'}
+ };
+
for my $keyword (@EXPORT) {
- delete ${ $caller . '::' }{$keyword};
+ my $code;
+ if(exists $is_removable{$keyword}
+ && ($code = $caller->can($keyword))
+ && (Mouse::Util::get_code_info($code))[0] eq __PACKAGE__){
+
+ delete $stash->{$keyword};
+ }
}
}
sub load_class {
my $class = shift;
- if (ref($class) || !defined($class) || !length($class)) {
+ if (!Mouse::Util::is_valid_class_name($class)) {
my $display = defined($class) ? $class : 'undef';
confess "Invalid class name ($display)";
}
- return 1 if $class eq 'Mouse::Object';
return 1 if is_class_loaded($class);
(my $file = "$class.pm") =~ 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 exists $is_class_loaded_cache{$class};
+
# walk the symbol table tree to avoid autovififying
# \*{${main::}{"Foo::"}} == \*main::Foo::
}
# check for $VERSION or @ISA
- return 1 if exists ${$$pack}{VERSION}
+ return ++$is_class_loaded_cache{$class} if exists ${$$pack}{VERSION}
&& defined *{${$$pack}{VERSION}}{SCALAR};
- return 1 if exists ${$$pack}{ISA}
+ return ++$is_class_loaded_cache{$class} if exists ${$$pack}{ISA}
&& defined *{${$$pack}{ISA}}{ARRAY};
# check for any method
foreach ( keys %{$$pack} ) {
next if substr($_, -2, 2) eq '::';
- return 1 if defined *{${$$pack}{$_}}{CODE};
+ return ++$is_class_loaded_cache{$class} if defined *{${$$pack}{$_}}{CODE};
}
# fail
}
sub class_of {
- return unless defined $_[0];
- my $class = blessed($_[0]) || $_[0];
- return Mouse::Meta::Class::get_metaclass_by_name($class);
+ return Mouse::Meta::Class::class_of($_[0]);
}
1;
faster.
We're also going as light on dependencies as possible.
-L<Class::Method::Modifiers> or L<Data::Util> is required if you want support
-for L</before>, L</after>, and L</around>.
+L<Class::Method::Modifiers::Fast> or L<Class::Method::Modifiers> is required
+if you want support for L</before>, L</after>, and L</around>.
=head2 MOOSE COMPAT
If you really must write a Mouse extension, please contact the Moose mailing
list or #moose on IRC beforehand.
+=head2 Maintenance
+
+The original author of this module has mostly stepped down from maintaining
+Mouse. See L<http://www.nntp.perl.org/group/perl.moose/2009/04/msg653.html>.
+If you would like to help maintain this module, please get in touch with us.
+
=head1 KEYWORDS
=head2 meta -> Mouse::Meta::Class
=head1 COPYRIGHT AND LICENSE
-Copyright 2008 Shawn M Moore.
+Copyright 2008-2009 Infinity Interactive, Inc.
+
+http://www.iinteractive.com/
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.