Merge branch 'stable'
[gitmo/Class-MOP.git] / t / 081_meta_package_extension.t
index 4e42d12..e0f393c 100644 (file)
@@ -1,45 +1,59 @@
-#!/usr/bin/perl
-
 use strict;
 use warnings;
 
-use Test::More tests => 16;
-use Test::Exception;
+use Test::More;
+use Test::Fatal;
 
-BEGIN {
-    use_ok('Class::MOP');        
-}
+use Class::MOP;
 
 {
-    package My::Meta::Package;
-    
+    package My::Package::Stash;
     use strict;
     use warnings;
-    
-    use Carp 'confess';
+
+    use base 'Package::Stash';
+
+    use metaclass;
+
     use Symbol 'gensym';
-    
-    use base 'Class::MOP::Package';
-    
+
     __PACKAGE__->meta->add_attribute(
-        '%:namespace' => (
+        'namespace' => (
+            reader  => 'namespace',
             default => sub { {} }
         )
-    );    
-    
-    sub add_package_symbol {
+    );
+
+    sub new {
+        my $class = shift;
+        $class->meta->new_object(__INSTANCE__ => $class->SUPER::new(@_));
+    }
+
+    sub add_symbol {
         my ($self, $variable, $initial_value) = @_;
-        
-        my ($name, $sigil, $type) = $self->_deconstruct_variable_name($variable);   
-    
+
+        (my $name = $variable) =~ s/^[\$\@\%\&]//;
+
         my $glob = gensym();
         *{$glob} = $initial_value if defined $initial_value;
-        $self->namespace->{$name} = $glob;    
-    }       
+        $self->namespace->{$name} = *{$glob};
+    }
 }
 
-# No actually package Foo exists :)
+{
+    package My::Meta::Package;
+
+    use strict;
+    use warnings;
 
+    use base 'Class::MOP::Package';
+
+    sub _package_stash {
+        $_[0]->{_package_stash} ||= My::Package::Stash->new($_[0]->name);
+    }
+}
+
+# No actually package Foo exists :)
 my $meta = My::Meta::Package->initialize('Foo');
 
 isa_ok($meta, 'My::Meta::Package');
@@ -48,9 +62,9 @@ isa_ok($meta, 'Class::MOP::Package');
 ok(!defined($Foo::{foo}), '... the %foo slot has not been created yet');
 ok(!$meta->has_package_symbol('%foo'), '... the meta agrees');
 
-lives_ok {
+is( exception {
     $meta->add_package_symbol('%foo' => { one => 1 });
-} '... the %foo symbol is created succcessfully';
+}, undef, '... the %foo symbol is created succcessfully' );
 
 ok(!defined($Foo::{foo}), '... the %foo slot has not been created in the actual Foo package');
 ok($meta->has_package_symbol('%foo'), '... the meta agrees');
@@ -64,17 +78,18 @@ is($foo, $meta->get_package_symbol('%foo'), '... our %foo is the same as the met
 
 ok(!defined($Foo::{bar}), '... the @bar slot has not been created yet');
 
-lives_ok {
+is( exception {
     $meta->add_package_symbol('@bar' => [ 1, 2, 3 ]);
-} '... created @Foo::bar successfully';
+}, undef, '... created @Foo::bar successfully' );
 
 ok(!defined($Foo::{bar}), '... the @bar slot has still not been created');
 
 ok(!defined($Foo::{baz}), '... the %baz slot has not been created yet');
 
-lives_ok {
+is( exception {
     $meta->add_package_symbol('%baz');
-} '... created %Foo::baz successfully';
+}, undef, '... created %Foo::baz successfully' );
 
 ok(!defined($Foo::{baz}), '... the %baz slot has still not been created');
 
+done_testing;