.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is turned on, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{ . if \nF \{ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "namespace::sweep 3pm" .TH namespace::sweep 3pm "2012-10-15" "perl v5.18.1" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" namespace::sweep \- Sweep up imported subs in your classes .SH "VERSION" .IX Header "VERSION" version 0.006 .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 1 \& package Foo; \& \& use namespace::sweep; \& use Some::Module qw(some_function); \& \& sub my_method { \& my $foo = some_function(); \& ... \& } \& \& package main; \& \& Foo\->my_method; # ok \& Foo\->some_function; # ERROR! .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" Because Perl methods are just regular subroutines, it's difficult to tell what's a method and what's just an imported function. As a result, imported functions can be called as methods on your objects. This pragma will delete imported functions from your class's symbol table, thereby ensuring that your interface is as you specified it. However, code inside your module will still be able to use the imported functions without any problems. .SH "ARGUMENTS" .IX Header "ARGUMENTS" The following arguments may be passed on the \f(CW\*(C`use\*(C'\fR line: .IP "\-cleanee" 4 .IX Item "-cleanee" If you want to clean a different class than the one importing this pragma, you can specify it with this flag. Otherwise, the importing class is assumed. .Sp .Vb 2 \& package Foo; \& use namespace::sweep \-cleanee => \*(AqBar\*(Aq # sweep up Bar.pm .Ve .IP "\-also" 4 .IX Item "-also" This lets you provide a mechanism to specify other subs to sweep up that would not normally be caught. (For example, private helper subs in your module's class that should not be called as methods.) .Sp .Vb 4 \& package Foo; \& use namespace::sweep \-also => \*(Aq_helper\*(Aq; # sweep up single sub \& use namespace::sweep \-also => [qw/foo bar baz/]; # list of subs \& use namespace::sweep \-also => qr/^secret_/; # subs matching regex .Ve .Sp You can also specify a subroutine reference which will receive the symbol name as \&\f(CW$_\fR. If the sub returns true, the symbol will be swept. .Sp .Vb 2 \& # sweep up those rude four\-letter subs \& use namespace::sweep \-also => sub { return 1 if length $_ == 4 } .Ve .Sp You can also combine these methods into an array reference: .Sp .Vb 1 \& use namespace::sweep \-also => [ \*(Aqstring\*(Aq, sub { 1 if /$pat/ and $_ !~ /$other/ }, qr/^foo_.+/ ]; .Ve .SH "RATIONALE" .IX Header "RATIONALE" This pragma was written to address some problems with the excellent namespace::autoclean. In particular, namespace::autoclean will remove special symbols that are installed by overload, so you can't use namespace::autoclean on objects that overload Perl operators. .PP Additionally, namespace::autoclean relies on Class::MOP to figure out the list of methods provided by your class. This pragma does not depend on Class::MOP or Moose, so you can use it for non-Moose classes without worrying about heavy dependencies. .PP However, if your class has a Moose (or Moose-compatible) \f(CW\*(C`meta\*(C'\fR object, then that will be used to find e.g. methods from composed roles that should not be deleted. .PP In most cases, namespace::sweep should work as a drop-in replacement for namespace::autoclean. Upon release, this pragma passes all of namespace::autoclean's tests, in addition to its own. .SH "CAVEATS" .IX Header "CAVEATS" This is an early release and there are bound to be a few hiccups along the way. .SH "ACKNOWLEDGEMENTS" .IX Header "ACKNOWLEDGEMENTS" Thanks Florian Ragwitz and Tomas Doran for writing and maintaining namespace::autoclean. .PP Thanks to Toby Inkster for submitting some better code for finding \f(CW\*(C`meta\*(C'\fR objects. .SH "SEE ALSO" .IX Header "SEE ALSO" namespace::autoclean, namespace::clean, overload .SH "AUTHOR" .IX Header "AUTHOR" Mike Friedman .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" This software is copyright (c) 2011 by Mike Friedman. .PP This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.