factor out meta method generation
[gitmo/Class-MOP.git] / lib / metaclass.pm
index d0a2aa7..192a664 100644 (file)
@@ -6,8 +6,9 @@ use warnings;
 
 use Carp         'confess';
 use Scalar::Util 'blessed';
+use Try::Tiny;
 
-our $VERSION   = '0.88';
+our $VERSION   = '1.09';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -19,6 +20,7 @@ sub import {
     unshift @args, "metaclass" if @args % 2 == 1;
     my %options = @args;
 
+    my $should_install_meta = !delete $options{no_meta};
     my $metaclass = delete $options{metaclass};
 
     unless ( defined $metaclass ) {
@@ -41,14 +43,7 @@ sub import {
 
     # create a meta object so we can install &meta
     my $meta = $metaclass->initialize($package => %options);
-    $meta->add_method('meta' => sub {
-        # we must re-initialize so that it
-        # works as expected in subclasses,
-        # since metaclass instances are
-        # singletons, this is not really a
-        # big deal anyway.
-        $metaclass->initialize((blessed($_[0]) || $_[0]) => %options)
-    });
+    $meta->_add_meta_method if $should_install_meta;
 }
 
 1;
@@ -87,11 +82,15 @@ metaclass - a pragma for installing and using Class::MOP metaclasses
       'method_metaclass'    => 'MyMethodMetaClass',
   );
 
+  # if we'd rather not install a 'meta' method, we can do this
+  use metaclass no_meta => 1;
+
 =head1 DESCRIPTION
 
 This is a pragma to make it easier to use a specific metaclass
 and a set of custom attribute and method metaclasses. It also
-installs a C<meta> method to your class as well.
+installs a C<meta> method to your class as well, if the
+C<no_meta> option is not specified.
 
 =head1 AUTHORS
 
@@ -99,7 +98,7 @@ Stevan Little E<lt>stevan@iinteractive.comE<gt>
 
 =head1 COPYRIGHT AND LICENSE
 
-Copyright 2006-2009 by Infinity Interactive, Inc.
+Copyright 2006-2010 by Infinity Interactive, Inc.
 
 L<http://www.iinteractive.com>