X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FRole.pm;h=57f319d3db83250ab00de3a02c9892101f1e0583;hb=ddd4992c86d379ec9b013bdbb6e070d939ee18f0;hp=b1164aad29eabb60e1e24f5a1f7a678758e7acf0;hpb=00c0e9c2dcc6d20f95f15ea1f2a3bebe54a2726c;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Role.pm b/lib/Mouse/Role.pm index b1164aa..57f319d 100644 --- a/lib/Mouse/Role.pm +++ b/lib/Mouse/Role.pm @@ -5,11 +5,18 @@ use warnings; 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'"; @@ -25,11 +32,29 @@ 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 { } }, + requires => sub { + return sub { } + }, + excludes => sub { + return sub { } + }, + blessed => sub { + return \&Scalar::Util::blessed; + }, + confess => sub { + return \&Carp::confess; + }, ); my $exporter = Sub::Exporter::build_exporter({ @@ -47,6 +72,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}; + } } };