From: Matt S Trout Date: Sat, 12 May 2012 16:35:04 +0000 (+0000) Subject: unimport::out_of X-Git-Tag: v1.001000~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=p5sagit%2FImport-Into.git;a=commitdiff_plain;h=100742112f9d3aada7ea4be3053a99b09a7ef745;hp=bef5d21dacf852839007b7cb6a3f94c21e188a96 unimport::out_of --- diff --git a/Changes b/Changes index b1a62fc..fa318b3 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,5 @@ + - add unimport::out_of + 1.000003 - 2012-05-06 - clarify how the method name trick works since apparently now people understand the eval/import trick they've noticed that that isn't the diff --git a/lib/Import/Into.pm b/lib/Import/Into.pm index 37fdddd..b1daa54 100644 --- a/lib/Import/Into.pm +++ b/lib/Import/Into.pm @@ -7,14 +7,23 @@ our $VERSION = '1.000003'; # 1.0.3 my %importers; +sub _importer { + my $target = shift; + \($importers{$target} ||= eval qq{ + package $target; + sub { my \$m = splice \@_, 1, 1; shift->\$m(\@_) }; + } or die "Couldn't build importer for $target: $@") +} + + sub import::into { my ($class, $target, @args) = @_; - $class->${\( - $importers{$target} ||= eval qq{ - package $target; - sub { shift->import(\@_) }; - } or die "Couldn't build importer for $target: $@" - )}(@args); + $class->${_importer($target)}(import => @args); +} + +sub unimport::out_of { + my ($class, $target, @args) = @_; + $class->${_importer($target)}(unimport => @args); } 1; @@ -61,6 +70,13 @@ C on it. This is a global method, and is callable on any package (and in fact on any object as well, although it's rarer that you'd want to do that). +Finally, we also provide an C to allow the exporting of the +effect of C: + + sub unimport { + Moose->unimport::out_of(scalar caller); # no MyThing == no Moose + } + If how and why this all works is of interest to you, please read on to the description immediately below.