Make Role::with die
[gitmo/Mouse.git] / lib / Mouse / Role.pm
index 678d4e9..0375d0c 100644 (file)
@@ -7,10 +7,16 @@ use Sub::Exporter;
 use Carp 'confess';
 use Scalar::Util;
 
+use Mouse::Meta::Role;
+
 do {
     my $CALLER;
 
     my %exports = (
+        meta => sub {
+            my $meta = Mouse::Meta::Role->initialize($CALLER);
+            return sub { $meta };
+        },
         extends => sub {
             return sub {
                 confess "Role does not currently support 'extends'";
@@ -26,10 +32,18 @@ do {
             return sub { }
         },
         has => sub {
-            return sub { }
+            my $caller = $CALLER;
+            return sub {
+                my $name = shift;
+                my @opts = @_;
+
+                $caller->meta->add_attribute($name => \@opts);
+            }
         },
         with => sub {
-            return sub { }
+            return sub {
+                confess "Role does not currently support 'with'";
+            }
         },
         requires => sub {
             return sub { }
@@ -60,6 +74,13 @@ do {
     }
 
     sub unimport {
+        my $caller = caller;
+
+        no strict 'refs';
+        for my $keyword (keys %exports) {
+            next if $keyword eq 'meta'; # we don't delete this one
+            delete ${ $caller . '::' }{$keyword};
+        }
     }
 };