Add built local::lib
[catagits/Gitalist.git] / local-lib5 / man / man3 / namespace::clean.3pm
1 .\" Automatically generated by Pod::Man v1.37, Pod::Parser v1.3
2 .\"
3 .\" Standard preamble:
4 .\" ========================================================================
5 .de Sh \" Subsection heading
6 .br
7 .if t .Sp
8 .ne 5
9 .PP
10 \fB\\$1\fR
11 .PP
12 ..
13 .de Sp \" Vertical space (when we can't use .PP)
14 .if t .sp .5v
15 .if n .sp
16 ..
17 .de Vb \" Begin verbatim text
18 .ft CW
19 .nf
20 .ne \\$1
21 ..
22 .de Ve \" End verbatim text
23 .ft R
24 .fi
25 ..
26 .\" Set up some character translations and predefined strings.  \*(-- will
27 .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
28 .\" double quote, and \*(R" will give a right double quote.  | will give a
29 .\" real vertical bar.  \*(C+ will give a nicer C++.  Capital omega is used to
30 .\" do unbreakable dashes and therefore won't be available.  \*(C` and \*(C'
31 .\" expand to `' in nroff, nothing in troff, for use with C<>.
32 .tr \(*W-|\(bv\*(Tr
33 .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
34 .ie n \{\
35 .    ds -- \(*W-
36 .    ds PI pi
37 .    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
38 .    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
39 .    ds L" ""
40 .    ds R" ""
41 .    ds C` ""
42 .    ds C' ""
43 'br\}
44 .el\{\
45 .    ds -- \|\(em\|
46 .    ds PI \(*p
47 .    ds L" ``
48 .    ds R" ''
49 'br\}
50 .\"
51 .\" If the F register is turned on, we'll generate index entries on stderr for
52 .\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
53 .\" entries marked with X<> in POD.  Of course, you'll have to process the
54 .\" output yourself in some meaningful fashion.
55 .if \nF \{\
56 .    de IX
57 .    tm Index:\\$1\t\\n%\t"\\$2"
58 ..
59 .    nr % 0
60 .    rr F
61 .\}
62 .\"
63 .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
64 .\" way too many mistakes in technical documents.
65 .hy 0
66 .if n .na
67 .\"
68 .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
69 .\" Fear.  Run.  Save yourself.  No user-serviceable parts.
70 .    \" fudge factors for nroff and troff
71 .if n \{\
72 .    ds #H 0
73 .    ds #V .8m
74 .    ds #F .3m
75 .    ds #[ \f1
76 .    ds #] \fP
77 .\}
78 .if t \{\
79 .    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
80 .    ds #V .6m
81 .    ds #F 0
82 .    ds #[ \&
83 .    ds #] \&
84 .\}
85 .    \" simple accents for nroff and troff
86 .if n \{\
87 .    ds ' \&
88 .    ds ` \&
89 .    ds ^ \&
90 .    ds , \&
91 .    ds ~ ~
92 .    ds /
93 .\}
94 .if t \{\
95 .    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
96 .    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
97 .    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
98 .    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
99 .    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
100 .    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
101 .\}
102 .    \" troff and (daisy-wheel) nroff accents
103 .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
104 .ds 8 \h'\*(#H'\(*b\h'-\*(#H'
105 .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
106 .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
107 .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
108 .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
109 .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
110 .ds ae a\h'-(\w'a'u*4/10)'e
111 .ds Ae A\h'-(\w'A'u*4/10)'E
112 .    \" corrections for vroff
113 .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
114 .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
115 .    \" for low resolution devices (crt and lpr)
116 .if \n(.H>23 .if \n(.V>19 \
117 \{\
118 .    ds : e
119 .    ds 8 ss
120 .    ds o a
121 .    ds d- d\h'-1'\(ga
122 .    ds D- D\h'-1'\(hy
123 .    ds th \o'bp'
124 .    ds Th \o'LP'
125 .    ds ae ae
126 .    ds Ae AE
127 .\}
128 .rm #[ #] #H #V #F C
129 .\" ========================================================================
130 .\"
131 .IX Title "namespace::clean 3"
132 .TH namespace::clean 3 "2009-03-03" "perl v5.8.7" "User Contributed Perl Documentation"
133 .SH "NAME"
134 namespace::clean \- Keep imports and functions out of your namespace
135 .SH "VERSION"
136 .IX Header "VERSION"
137 0.11
138 .SH "SYNOPSIS"
139 .IX Header "SYNOPSIS"
140 .Vb 3
141 \&  package Foo;
142 \&  use warnings;
143 \&  use strict;
144 .Ve
145 .PP
146 .Vb 1
147 \&  use Carp qw(croak);   # 'croak' will be removed
148 .Ve
149 .PP
150 .Vb 1
151 \&  sub bar { 23 }        # 'bar' will be removed
152 .Ve
153 .PP
154 .Vb 2
155 \&  # remove all previously defined functions
156 \&  use namespace::clean;
157 .Ve
158 .PP
159 .Vb 1
160 \&  sub baz { bar() }     # 'baz' still defined, 'bar' still bound
161 .Ve
162 .PP
163 .Vb 2
164 \&  # begin to collection function names from here again
165 \&  no namespace::clean;
166 .Ve
167 .PP
168 .Vb 1
169 \&  sub quux { baz() }    # 'quux' will be removed
170 .Ve
171 .PP
172 .Vb 2
173 \&  # remove all functions defined after the 'no' unimport
174 \&  use namespace::clean;
175 .Ve
176 .PP
177 .Vb 5
178 \&  # Will print: 'No', 'No', 'Yes' and 'No'
179 \&  print +(__PACKAGE__\->can('croak') ? 'Yes' : 'No'), "\en";
180 \&  print +(__PACKAGE__\->can('bar')   ? 'Yes' : 'No'), "\en";
181 \&  print +(__PACKAGE__\->can('baz')   ? 'Yes' : 'No'), "\en";
182 \&  print +(__PACKAGE__\->can('quux')  ? 'Yes' : 'No'), "\en";
183 .Ve
184 .PP
185 .Vb 1
186 \&  1;
187 .Ve
188 .SH "DESCRIPTION"
189 .IX Header "DESCRIPTION"
190 .Sh "Keeping packages clean"
191 .IX Subsection "Keeping packages clean"
192 When you define a function, or import one, into a Perl package, it will
193 naturally also be available as a method. This does not per se cause
194 problems, but it can complicate subclassing and, for example, plugin
195 classes that are included via multiple inheritance by loading them as 
196 base classes.
197 .PP
198 The \f(CW\*(C`namespace::clean\*(C'\fR pragma will remove all previously declared or
199 imported symbols at the end of the current package's compile cycle.
200 Functions called in the package itself will still be bound by their
201 name, but they won't show up as methods on your class or instances.
202 .PP
203 By unimporting via \f(CW\*(C`no\*(C'\fR you can tell \f(CW\*(C`namespace::clean\*(C'\fR to start
204 collecting functions for the next \f(CW\*(C`use namespace::clean;\*(C'\fR specification.
205 .PP
206 You can use the \f(CW\*(C`\-except\*(C'\fR flag to tell \f(CW\*(C`namespace::clean\*(C'\fR that you
207 don't want it to remove a certain function or method. A common use would
208 be a module exporting an \f(CW\*(C`import\*(C'\fR method along with some functions:
209 .PP
210 .Vb 2
211 \&  use ModuleExportingImport;
212 \&  use namespace::clean \-except => [qw( import )];
213 .Ve
214 .PP
215 If you just want to \f(CW\*(C`\-except\*(C'\fR a single sub, you can pass it directly.
216 For more than one value you have to use an array reference.
217 .Sh "Explicitely removing functions when your scope is compiled"
218 .IX Subsection "Explicitely removing functions when your scope is compiled"
219 It is also possible to explicitely tell \f(CW\*(C`namespace::clean\*(C'\fR what packages
220 to remove when the surrounding scope has finished compiling. Here is an
221 example:
222 .PP
223 .Vb 2
224 \&  package Foo;
225 \&  use strict;
226 .Ve
227 .PP
228 .Vb 1
229 \&  # blessed NOT available
230 .Ve
231 .PP
232 .Vb 3
233 \&  sub my_class {
234 \&      use Scalar::Util qw( blessed );
235 \&      use namespace::clean qw( blessed );
236 .Ve
237 .PP
238 .Vb 3
239 \&      # blessed available
240 \&      return blessed shift;
241 \&  }
242 .Ve
243 .PP
244 .Vb 1
245 \&  # blessed NOT available
246 .Ve
247 .Sh "Moose"
248 .IX Subsection "Moose"
249 When using \f(CW\*(C`namespace::clean\*(C'\fR together with Moose you want to keep
250 the installed \f(CW\*(C`meta\*(C'\fR method. So your classes should look like:
251 .PP
252 .Vb 4
253 \&  package Foo;
254 \&  use Moose;
255 \&  use namespace::clean \-except => 'meta';
256 \&  ...
257 .Ve
258 .PP
259 Same goes for Moose::Role.
260 .Sh "Cleaning other packages"
261 .IX Subsection "Cleaning other packages"
262 You can tell \f(CW\*(C`namespace::clean\*(C'\fR that you want to clean up another package
263 instead of the one importing. To do this you have to pass in the \f(CW\*(C`\-cleanee\*(C'\fR
264 option like this:
265 .PP
266 .Vb 2
267 \&  package My::MooseX::namespace::clean;
268 \&  use strict;
269 .Ve
270 .PP
271 .Vb 1
272 \&  use namespace::clean (); # no cleanup, just load
273 .Ve
274 .PP
275 .Vb 6
276 \&  sub import {
277 \&      namespace::clean\->import(
278 \&        \-cleanee => scalar(caller),
279 \&        \-except  => 'meta',
280 \&      );
281 \&  }
282 .Ve
283 .PP
284 If you don't care about \f(CW\*(C`namespace::clean\*(C'\fRs discover\-and\-\f(CW\*(C`\-except\*(C'\fR logic, and
285 just want to remove subroutines, try \*(L"clean_subroutines\*(R".
286 .SH "METHODS"
287 .IX Header "METHODS"
288 You shouldn't need to call any of these. Just \f(CW\*(C`use\*(C'\fR the package at the
289 appropriate place.
290 .Sh "clean_subroutines"
291 .IX Subsection "clean_subroutines"
292 This exposes the actual subroutine-removal logic.
293 .PP
294 .Vb 1
295 \&  namespace::clean\->clean_subroutines($cleanee, qw( subA subB ));
296 .Ve
297 .PP
298 will remove \f(CW\*(C`subA\*(C'\fR and \f(CW\*(C`subB\*(C'\fR from \f(CW$cleanee\fR. Note that this will remove the
299 subroutines \fBimmediately\fR and not wait for scope end. If you want to have this
300 effect at a specific time (e.g. \f(CW\*(C`namespace::clean\*(C'\fR acts on scope compile end)
301 it is your responsibility to make sure it runs at that time.
302 .Sh "import"
303 .IX Subsection "import"
304 Makes a snapshot of the current defined functions and installs a
305 B::Hooks::EndOfScope hook in the current scope to invoke the cleanups.
306 .Sh "unimport"
307 .IX Subsection "unimport"
308 This method will be called when you do a
309 .PP
310 .Vb 1
311 \&  no namespace::clean;
312 .Ve
313 .PP
314 It will start a new section of code that defines functions to clean up.
315 .Sh "get_class_store"
316 .IX Subsection "get_class_store"
317 This returns a reference to a hash in a passed package containing 
318 information about function names included and excluded from removal.
319 .Sh "get_functions"
320 .IX Subsection "get_functions"
321 Takes a class as argument and returns all currently defined functions
322 in it as a hash reference with the function name as key and a typeglob
323 reference to the symbol as value.
324 .SH "IMPLEMENTATION DETAILS"
325 .IX Header "IMPLEMENTATION DETAILS"
326 This module works through the effect that a 
327 .PP
328 .Vb 1
329 \&  delete $SomePackage::{foo};
330 .Ve
331 .PP
332 will remove the \f(CW\*(C`foo\*(C'\fR symbol from \f(CW$SomePackage\fR for run time lookups
333 (e.g., method calls) but will leave the entry alive to be called by
334 already resolved names in the package itself. \f(CW\*(C`namespace::clean\*(C'\fR will
335 restore and therefor in effect keep all glob slots that aren't \f(CW\*(C`CODE\*(C'\fR.
336 .PP
337 A test file has been added to the perl core to ensure that this behaviour
338 will be stable in future releases.
339 .PP
340 Just for completeness sake, if you want to remove the symbol completely,
341 use \f(CW\*(C`undef\*(C'\fR instead.
342 .SH "SEE ALSO"
343 .IX Header "SEE ALSO"
344 B::Hooks::EndOfScope
345 .SH "AUTHOR AND COPYRIGHT"
346 .IX Header "AUTHOR AND COPYRIGHT"
347 Robert 'phaylon' Sedlacek \f(CW\*(C`<rs@474.at>\*(C'\fR, with many thanks to
348 Matt S Trout for the inspiration on the whole idea.
349 .SH "LICENSE"
350 .IX Header "LICENSE"
351 This program is free software; you can redistribute it and/or modify 
352 it under the same terms as perl itself.