X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FRole.pm;h=10621cce90bdd194a0c0b0ac8c93d7019bdb3ee0;hb=69ac1dcfa408b64733ba3d2e47e8e791e4548f95;hp=ddd435a1b1e63b1f7a57bdd0d0bbee93a3c50078;hpb=964eaf79edd2e1a4bc4582da06f8cdc18fc75035;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Role.pm b/lib/Mouse/Role.pm index ddd435a..10621cc 100644 --- a/lib/Mouse/Role.pm +++ b/lib/Mouse/Role.pm @@ -5,16 +5,58 @@ 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'"; } }, + before => sub { + return sub { } + }, + after => sub { + return sub { } + }, + around => sub { + return sub { } + }, + has => sub { + my $caller = $CALLER; + return sub { + my $name = shift; + my %opts = @_; + + $caller->meta->add_attribute($name => \%opts); + } + }, + with => sub { + return sub { + confess "Role does not currently support 'with'"; + } + }, + 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({ @@ -32,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}; + } } };