X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FRole.pm;h=57f319d3db83250ab00de3a02c9892101f1e0583;hb=ddd4992c86d379ec9b013bdbb6e070d939ee18f0;hp=8eeadc9c481e704859fb38cd82d730c8d896464e;hpb=eb812bdec4270b062ab0f35e2d22696e92324dfe;p=gitmo%2FMouse.git diff --git a/lib/Mouse/Role.pm b/lib/Mouse/Role.pm index 8eeadc9..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,7 +32,13 @@ 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 { } @@ -36,6 +49,12 @@ do { excludes => sub { return sub { } }, + blessed => sub { + return \&Scalar::Util::blessed; + }, + confess => sub { + return \&Carp::confess; + }, ); my $exporter = Sub::Exporter::build_exporter({ @@ -53,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}; + } } };