X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoo%2FRole.pm;h=fbdd52b99fc70feea3b2a4047b7603abdae01f33;hb=108f8ddcc8c9c70cdc1eb4b60210e47a1dfe1d06;hp=5145edce20f3a771e5220f536ea85caee784de91;hpb=34a69e36826582e95f8a31215f6dff570b1bddc6;p=gitmo%2FMoo.git diff --git a/lib/Moo/Role.pm b/lib/Moo/Role.pm index 5145edc..fbdd52b 100644 --- a/lib/Moo/Role.pm +++ b/lib/Moo/Role.pm @@ -10,14 +10,21 @@ BEGIN { *INFO = \%Role::Tiny::INFO } our %INFO; +sub _install_tracked { + my ($target, $name, $code) = @_; + $INFO{$target}{exports}{$name} = $code; + _install_coderef "${target}::${name}" => "Moo::Role::${name}" => $code; +} + sub import { my $target = caller; my ($me) = @_; strictures->import; return if $INFO{$target}; # already exported into this package + $INFO{$target} = {}; # get symbol table reference my $stash = do { no strict 'refs'; \%{"${target}::"} }; - _install_coderef "${target}::has" => "Moo::Role::has" => sub { + _install_tracked $target => has => sub { my ($name, %spec) = @_; ($INFO{$target}{accessor_maker} ||= do { require Method::Generate::Accessor; @@ -28,17 +35,17 @@ sub import { }; # install before/after/around subs foreach my $type (qw(before after around)) { - *{_getglob "${target}::${type}"} = sub { + _install_tracked $target => $type => sub { require Class::Method::Modifiers; push @{$INFO{$target}{modifiers}||=[]}, [ $type => @_ ]; $me->_maybe_reset_handlemoose($target); }; } - *{_getglob "${target}::requires"} = sub { + _install_tracked $target => requires => sub { push @{$INFO{$target}{requires}||=[]}, @_; $me->_maybe_reset_handlemoose($target); }; - *{_getglob "${target}::with"} = sub { + _install_tracked $target => with => sub { $me->apply_roles_to_package($target, @_); $me->_maybe_reset_handlemoose($target); }; @@ -56,6 +63,11 @@ sub import { } } +sub unimport { + my $target = caller; + _unimport_coderefs($target, $INFO{$target}); +} + sub _maybe_reset_handlemoose { my ($class, $target) = @_; if ($INC{"Moo/HandleMoose.pm"}) {