Refactoring
[gitmo/Mouse.git] / lib / Mouse.pm
index 7cdd243..98d19e5 100644 (file)
@@ -4,7 +4,7 @@ use warnings;
 use 5.006;
 use base 'Exporter';
 
-our $VERSION = '0.24';
+our $VERSION = '0.30';
 
 use Carp 'confess';
 use Scalar::Util 'blessed';
@@ -17,6 +17,10 @@ use Mouse::Util::TypeConstraints;
 
 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 {
@@ -88,6 +92,45 @@ sub override {
     });
 }
 
+sub init_meta {
+    # This used to be called as a function. This hack preserves
+    # backwards compatibility.
+    if ( $_[0] ne __PACKAGE__ ) {
+        return __PACKAGE__->init_meta(
+            for_class  => $_[0],
+            base_class => $_[1],
+            metaclass  => $_[2],
+        );
+    }
+
+    shift;
+    my %args = @_;
+
+    my $class = $args{for_class}
+      or Carp::croak(
+        "Cannot call init_meta without specifying a for_class");
+    my $base_class = $args{base_class} || 'Mouse::Object';
+    my $metaclass  = $args{metaclass}  || 'Mouse::Meta::Class';
+
+    Carp::croak("The Metaclass $metaclass must be a subclass of Mouse::Meta::Class.")
+            unless $metaclass->isa('Mouse::Meta::Class');
+    
+    # make a subtype for each Mouse class
+    class_type($class)
+        unless find_type_constraint($class);
+
+    my $meta = $metaclass->initialize($class);
+    $meta->superclasses($base_class)
+        unless $meta->superclasses;
+
+    $meta->add_method(meta => sub{
+        return Mouse::Meta::Class->initialize(ref($_[0]) || $_[0]);
+    });
+
+
+    return $meta;
+}
+
 sub import {
     my $class = shift;
 
@@ -111,16 +154,9 @@ sub import {
         return;
     }
 
-    my $meta = Mouse::Meta::Class->initialize($caller);
-    $meta->superclasses('Mouse::Object')
-        unless $meta->superclasses;
-
-    # make a subtype for each Mouse class
-    class_type($caller) unless find_type_constraint($caller);
-
-    no strict 'refs';
-    no warnings 'redefine';
-    *{$caller.'::meta'} = sub { $meta };
+    Mouse->init_meta(
+        for_class  => $caller,
+    );
 
     if (@_) {
         __PACKAGE__->export_to_level( $level+1, $class, @_);
@@ -136,9 +172,19 @@ sub import {
 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};
+        }
     }
 }
 
@@ -192,9 +238,7 @@ sub is_class_loaded {
 }
 
 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;
@@ -235,16 +279,19 @@ Mouse - Moose minus the antlers
 
 L<Moose> is wonderful. B<Use Moose instead of Mouse.>
 
-Unfortunately, Moose has a compile-time penalty. Though significant progress has
-been made over the years, the compile time penalty is a non-starter for some
-applications.
+Unfortunately, Moose has a compile-time penalty. Though significant progress
+has been made over the years, the compile time penalty is a non-starter for
+some very specific applications. If you are writing a command-line application
+or CGI script where startup time is essential, you may not be able to use
+Moose. We recommend that you instead use L<HTTP::Engine> and FastCGI for the
+latter, if possible.
 
 Mouse aims to alleviate this by providing a subset of Moose's functionality,
 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
 
@@ -256,7 +303,13 @@ runs the test suite 4x faster.
 The idea is that, if you need the extra power, you should be able to run
 C<s/Mouse/Moose/g> on your codebase and have nothing break. To that end,
 we have written L<Any::Moose> which will act as Mouse unless Moose is loaded,
-in which case it will act as Moose.
+in which case it will act as Moose. Since Mouse is a little sloppier than
+Moose, if you run into weird errors, it would be worth running:
+
+    ANY_MOOSE=Moose perl your-script.pl
+
+to see if the bug is caused by Mouse. Moose's diagnostics and validation are
+also much better.
 
 =head2 MouseX
 
@@ -266,6 +319,12 @@ should upgrade to Moose. We don't need two parallel sets of extensions!
 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
@@ -462,7 +521,9 @@ L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Mouse>.
 
 =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.