summaryrefslogtreecommitdiffstats
path: root/upstream/debian-unstable/man3/Exporter.3perl
diff options
context:
space:
mode:
Diffstat (limited to 'upstream/debian-unstable/man3/Exporter.3perl')
-rw-r--r--upstream/debian-unstable/man3/Exporter.3perl590
1 files changed, 590 insertions, 0 deletions
diff --git a/upstream/debian-unstable/man3/Exporter.3perl b/upstream/debian-unstable/man3/Exporter.3perl
new file mode 100644
index 00000000..217dbc4d
--- /dev/null
+++ b/upstream/debian-unstable/man3/Exporter.3perl
@@ -0,0 +1,590 @@
+.\" -*- mode: troff; coding: utf-8 -*-
+.\" Automatically generated by Pod::Man 5.01 (Pod::Simple 3.43)
+.\"
+.\" 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
+..
+.\" \*(C` and \*(C' are quotes in nroff, nothing in troff, for use with C<>.
+.ie n \{\
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. 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 >0, 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
+.\" ========================================================================
+.\"
+.IX Title "Exporter 3perl"
+.TH Exporter 3perl 2024-01-12 "perl v5.38.2" "Perl Programmers Reference Guide"
+.\" 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
+Exporter \- Implements default import method for modules
+.SH SYNOPSIS
+.IX Header "SYNOPSIS"
+In module \fIYourModule.pm\fR:
+.PP
+.Vb 3
+\& package YourModule;
+\& use Exporter \*(Aqimport\*(Aq;
+\& our @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+.Ve
+.PP
+or
+.PP
+.Vb 4
+\& package YourModule;
+\& require Exporter;
+\& our @ISA = qw(Exporter); # inherit all of Exporter\*(Aqs methods
+\& our @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+.Ve
+.PP
+or
+.PP
+.Vb 3
+\& package YourModule;
+\& use parent \*(AqExporter\*(Aq; # inherit all of Exporter\*(Aqs methods
+\& our @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+.Ve
+.PP
+In other files which wish to use \f(CW\*(C`YourModule\*(C'\fR:
+.PP
+.Vb 2
+\& use YourModule qw(frobnicate); # import listed symbols
+\& frobnicate ($left, $right) # calls YourModule::frobnicate
+.Ve
+.PP
+Take a look at "Good Practices" for some variants
+you will like to use in modern Perl code.
+.SH DESCRIPTION
+.IX Header "DESCRIPTION"
+The Exporter module implements an \f(CW\*(C`import\*(C'\fR method which allows a module
+to export functions and variables to its users' namespaces. Many modules
+use Exporter rather than implementing their own \f(CW\*(C`import\*(C'\fR method because
+Exporter provides a highly flexible interface, with an implementation optimised
+for the common case.
+.PP
+Perl automatically calls the \f(CW\*(C`import\*(C'\fR method when processing a
+\&\f(CW\*(C`use\*(C'\fR statement for a module. Modules and \f(CW\*(C`use\*(C'\fR are documented
+in perlfunc and perlmod. Understanding the concept of
+modules and how the \f(CW\*(C`use\*(C'\fR statement operates is important to
+understanding the Exporter.
+.SS "How to Export"
+.IX Subsection "How to Export"
+The arrays \f(CW@EXPORT\fR and \f(CW@EXPORT_OK\fR in a module hold lists of
+symbols that are going to be exported into the users name space by
+default, or which they can request to be exported, respectively. The
+symbols can represent functions, scalars, arrays, hashes, or typeglobs.
+The symbols must be given by full name with the exception that the
+ampersand in front of a function is optional, e.g.
+.PP
+.Vb 2
+\& our @EXPORT = qw(afunc $scalar @array); # afunc is a function
+\& our @EXPORT_OK = qw(&bfunc %hash *typeglob); # explicit prefix on &bfunc
+.Ve
+.PP
+If you are only exporting function names it is recommended to omit the
+ampersand, as the implementation is faster this way.
+.SS "Selecting What to Export"
+.IX Subsection "Selecting What to Export"
+Do \fBnot\fR export method names!
+.PP
+Do \fBnot\fR export anything else by default without a good reason!
+.PP
+Exports pollute the namespace of the module user. If you must export
+try to use \f(CW@EXPORT_OK\fR in preference to \f(CW@EXPORT\fR and avoid short or
+common symbol names to reduce the risk of name clashes.
+.PP
+Generally anything not exported is still accessible from outside the
+module using the \f(CW\*(C`YourModule::item_name\*(C'\fR (or \f(CW\*(C`$blessed_ref\->method\*(C'\fR)
+syntax. By convention you can use a leading underscore on names to
+informally indicate that they are 'internal' and not for public use.
+.PP
+(It is actually possible to get private functions by saying:
+.PP
+.Vb 3
+\& my $subref = sub { ... };
+\& $subref\->(@args); # Call it as a function
+\& $obj\->$subref(@args); # Use it as a method
+.Ve
+.PP
+However if you use them for methods it is up to you to figure out
+how to make inheritance work.)
+.PP
+As a general rule, if the module is trying to be object oriented
+then export nothing. If it's just a collection of functions then
+\&\f(CW@EXPORT_OK\fR anything but use \f(CW@EXPORT\fR with caution. For function and
+method names use barewords in preference to names prefixed with
+ampersands for the export lists.
+.PP
+Other module design guidelines can be found in perlmod.
+.SS "How to Import"
+.IX Subsection "How to Import"
+In other files which wish to use your module there are three basic ways for
+them to load your module and import its symbols:
+.ie n .IP """use YourModule;""" 4
+.el .IP "\f(CWuse YourModule;\fR" 4
+.IX Item "use YourModule;"
+This imports all the symbols from YourModule's \f(CW@EXPORT\fR into the namespace
+of the \f(CW\*(C`use\*(C'\fR statement.
+.ie n .IP """use YourModule ();""" 4
+.el .IP "\f(CWuse YourModule ();\fR" 4
+.IX Item "use YourModule ();"
+This causes perl to load your module but does not import any symbols.
+.ie n .IP """use YourModule qw(...);""" 4
+.el .IP "\f(CWuse YourModule qw(...);\fR" 4
+.IX Item "use YourModule qw(...);"
+This imports only the symbols listed by the caller into their namespace.
+All listed symbols must be in your \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR, else an error
+occurs. The advanced export features of Exporter are accessed like this,
+but with list entries that are syntactically distinct from symbol names.
+.PP
+Unless you want to use its advanced features, this is probably all you
+need to know to use Exporter.
+.SH "Advanced Features"
+.IX Header "Advanced Features"
+.SS "Specialised Import Lists"
+.IX Subsection "Specialised Import Lists"
+If any of the entries in an import list begins with !, : or / then
+the list is treated as a series of specifications which either add to
+or delete from the list of names to import. They are processed left to
+right. Specifications are in the form:
+.PP
+.Vb 4
+\& [!]name This name only
+\& [!]:DEFAULT All names in @EXPORT
+\& [!]:tag All names in $EXPORT_TAGS{tag} anonymous array
+\& [!]/pattern/ All names in @EXPORT and @EXPORT_OK which match
+.Ve
+.PP
+A leading ! indicates that matching names should be deleted from the
+list of names to import. If the first specification is a deletion it
+is treated as though preceded by :DEFAULT. If you just want to import
+extra names in addition to the default set you will still need to
+include :DEFAULT explicitly.
+.PP
+e.g., \fIModule.pm\fR defines:
+.PP
+.Vb 3
+\& our @EXPORT = qw(A1 A2 A3 A4 A5);
+\& our @EXPORT_OK = qw(B1 B2 B3 B4 B5);
+\& our %EXPORT_TAGS = (T1 => [qw(A1 A2 B1 B2)], T2 => [qw(A1 A2 B3 B4)]);
+.Ve
+.PP
+Note that you cannot use tags in \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR.
+.PP
+Names in EXPORT_TAGS must also appear in \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR.
+.PP
+An application using Module can say something like:
+.PP
+.Vb 1
+\& use Module qw(:DEFAULT :T2 !B3 A3);
+.Ve
+.PP
+Other examples include:
+.PP
+.Vb 2
+\& use Socket qw(!/^[AP]F_/ !SOMAXCONN !SOL_SOCKET);
+\& use POSIX qw(:errno_h :termios_h !TCSADRAIN !/^EXIT/);
+.Ve
+.PP
+Remember that most patterns (using //) will need to be anchored
+with a leading ^, e.g., \f(CW\*(C`/^EXIT/\*(C'\fR rather than \f(CW\*(C`/EXIT/\*(C'\fR.
+.PP
+You can say \f(CW\*(C`BEGIN { $Exporter::Verbose=1 }\*(C'\fR to see how the
+specifications are being processed and what is actually being imported
+into modules.
+.SS "Exporting Without Using Exporter's import Method"
+.IX Subsection "Exporting Without Using Exporter's import Method"
+Exporter has a special method, 'export_to_level' which is used in situations
+where you can't directly call Exporter's
+import method. The export_to_level
+method looks like:
+.PP
+.Vb 3
+\& MyPackage\->export_to_level(
+\& $where_to_export, $package, @what_to_export
+\& );
+.Ve
+.PP
+where \f(CW$where_to_export\fR is an integer telling how far up the calling stack
+to export your symbols, and \f(CW@what_to_export\fR is an array telling what
+symbols *to* export (usually this is \f(CW@_\fR). The \f(CW$package\fR argument is
+currently unused.
+.PP
+For example, suppose that you have a module, A, which already has an
+import function:
+.PP
+.Vb 1
+\& package A;
+\&
+\& our @ISA = qw(Exporter);
+\& our @EXPORT_OK = qw($b);
+\&
+\& sub import
+\& {
+\& $A::b = 1; # not a very useful import method
+\& }
+.Ve
+.PP
+and you want to Export symbol \f(CW$A::b\fR back to the module that called
+package A. Since Exporter relies on the import method to work, via
+inheritance, as it stands \fBExporter::import()\fR will never get called.
+Instead, say the following:
+.PP
+.Vb 3
+\& package A;
+\& our @ISA = qw(Exporter);
+\& our @EXPORT_OK = qw($b);
+\&
+\& sub import
+\& {
+\& $A::b = 1;
+\& A\->export_to_level(1, @_);
+\& }
+.Ve
+.PP
+This will export the symbols one level 'above' the current package \- ie: to
+the program or module that used package A.
+.PP
+Note: Be careful not to modify \f(CW@_\fR at all before you call export_to_level
+\&\- or people using your package will get very unexplained results!
+.SS "Exporting Without Inheriting from Exporter"
+.IX Subsection "Exporting Without Inheriting from Exporter"
+By including Exporter in your \f(CW@ISA\fR you inherit an Exporter's \fBimport()\fR method
+but you also inherit several other helper methods which you probably don't
+want and complicate the inheritance tree. To avoid this you can do:
+.PP
+.Vb 2
+\& package YourModule;
+\& use Exporter qw(import);
+.Ve
+.PP
+which will export Exporter's own \fBimport()\fR method into YourModule.
+Everything will work as before but you won't need to include Exporter in
+\&\f(CW@YourModule::ISA\fR.
+.PP
+Note: This feature was introduced in version 5.57
+of Exporter, released with perl 5.8.3.
+.SS "Module Version Checking"
+.IX Subsection "Module Version Checking"
+The Exporter module will convert an attempt to import a number from a
+module into a call to \f(CW\*(C`$module_name\->VERSION($value)\*(C'\fR. This can
+be used to validate that the version of the module being used is
+greater than or equal to the required version.
+.PP
+For historical reasons, Exporter supplies a \f(CW\*(C`require_version\*(C'\fR method that
+simply delegates to \f(CW\*(C`VERSION\*(C'\fR. Originally, before \f(CW\*(C`UNIVERSAL::VERSION\*(C'\fR
+existed, Exporter would call \f(CW\*(C`require_version\*(C'\fR.
+.PP
+Since the \f(CW\*(C`UNIVERSAL::VERSION\*(C'\fR method treats the \f(CW$VERSION\fR number as
+a simple numeric value it will regard version 1.10 as lower than
+1.9. For this reason it is strongly recommended that you use numbers
+with at least two decimal places, e.g., 1.09.
+.SS "Managing Unknown Symbols"
+.IX Subsection "Managing Unknown Symbols"
+In some situations you may want to prevent certain symbols from being
+exported. Typically this applies to extensions which have functions
+or constants that may not exist on some systems.
+.PP
+The names of any symbols that cannot be exported should be listed
+in the \f(CW@EXPORT_FAIL\fR array.
+.PP
+If a module attempts to import any of these symbols the Exporter
+will give the module an opportunity to handle the situation before
+generating an error. The Exporter will call an export_fail method
+with a list of the failed symbols:
+.PP
+.Vb 1
+\& @failed_symbols = $module_name\->export_fail(@failed_symbols);
+.Ve
+.PP
+If the \f(CW\*(C`export_fail\*(C'\fR method returns an empty list then no error is
+recorded and all the requested symbols are exported. If the returned
+list is not empty then an error is generated for each symbol and the
+export fails. The Exporter provides a default \f(CW\*(C`export_fail\*(C'\fR method which
+simply returns the list unchanged.
+.PP
+Uses for the \f(CW\*(C`export_fail\*(C'\fR method include giving better error messages
+for some symbols and performing lazy architectural checks (put more
+symbols into \f(CW@EXPORT_FAIL\fR by default and then take them out if someone
+actually tries to use them and an expensive check shows that they are
+usable on that platform).
+.SS "Tag Handling Utility Functions"
+.IX Subsection "Tag Handling Utility Functions"
+Since the symbols listed within \f(CW%EXPORT_TAGS\fR must also appear in either
+\&\f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR, two utility functions are provided which allow
+you to easily add tagged sets of symbols to \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR:
+.PP
+.Vb 1
+\& our %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+\&
+\& Exporter::export_tags(\*(Aqfoo\*(Aq); # add aa, bb and cc to @EXPORT
+\& Exporter::export_ok_tags(\*(Aqbar\*(Aq); # add aa, cc and dd to @EXPORT_OK
+.Ve
+.PP
+Any names which are not tags are added to \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR
+unchanged but will trigger a warning (with \f(CW\*(C`\-w\*(C'\fR) to avoid misspelt tags
+names being silently added to \f(CW@EXPORT\fR or \f(CW@EXPORT_OK\fR. Future versions
+may make this a fatal error.
+.SS "Generating Combined Tags"
+.IX Subsection "Generating Combined Tags"
+If several symbol categories exist in \f(CW%EXPORT_TAGS\fR, it's usually
+useful to create the utility ":all" to simplify "use" statements.
+.PP
+The simplest way to do this is:
+.PP
+.Vb 1
+\& our %EXPORT_TAGS = (foo => [qw(aa bb cc)], bar => [qw(aa cc dd)]);
+\&
+\& # add all the other ":class" tags to the ":all" class,
+\& # deleting duplicates
+\& {
+\& my %seen;
+\&
+\& push @{$EXPORT_TAGS{all}},
+\& grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}} foreach keys %EXPORT_TAGS;
+\& }
+.Ve
+.PP
+\&\fICGI.pm\fR creates an ":all" tag which contains some (but not really
+all) of its categories. That could be done with one small
+change:
+.PP
+.Vb 4
+\& # add some of the other ":class" tags to the ":all" class,
+\& # deleting duplicates
+\& {
+\& my %seen;
+\&
+\& push @{$EXPORT_TAGS{all}},
+\& grep {!$seen{$_}++} @{$EXPORT_TAGS{$_}}
+\& foreach qw/html2 html3 netscape form cgi internal/;
+\& }
+.Ve
+.PP
+Note that the tag names in \f(CW%EXPORT_TAGS\fR don't have the leading ':'.
+.ie n .SS """AUTOLOAD""ed Constants"
+.el .SS "\f(CWAUTOLOAD\fPed Constants"
+.IX Subsection "AUTOLOADed Constants"
+Many modules make use of \f(CW\*(C`AUTOLOAD\*(C'\fRing for constant subroutines to
+avoid having to compile and waste memory on rarely used values (see
+perlsub for details on constant subroutines). Calls to such
+constant subroutines are not optimized away at compile time because
+they can't be checked at compile time for constancy.
+.PP
+Even if a prototype is available at compile time, the body of the
+subroutine is not (it hasn't been \f(CW\*(C`AUTOLOAD\*(C'\fRed yet). perl needs to
+examine both the \f(CW\*(C`()\*(C'\fR prototype and the body of a subroutine at
+compile time to detect that it can safely replace calls to that
+subroutine with the constant value.
+.PP
+A workaround for this is to call the constants once in a \f(CW\*(C`BEGIN\*(C'\fR block:
+.PP
+.Vb 1
+\& package My ;
+\&
+\& use Socket ;
+\&
+\& foo( SO_LINGER ); ## SO_LINGER NOT optimized away; called at runtime
+\& BEGIN { SO_LINGER }
+\& foo( SO_LINGER ); ## SO_LINGER optimized away at compile time.
+.Ve
+.PP
+This forces the \f(CW\*(C`AUTOLOAD\*(C'\fR for \f(CW\*(C`SO_LINGER\*(C'\fR to take place before
+SO_LINGER is encountered later in \f(CW\*(C`My\*(C'\fR package.
+.PP
+If you are writing a package that \f(CW\*(C`AUTOLOAD\*(C'\fRs, consider forcing
+an \f(CW\*(C`AUTOLOAD\*(C'\fR for any constants explicitly imported by other packages
+or which are usually used when your package is \f(CW\*(C`use\*(C'\fRd.
+.SH "Good Practices"
+.IX Header "Good Practices"
+.ie n .SS "Declaring @EXPORT_OK and Friends"
+.el .SS "Declaring \f(CW@EXPORT_OK\fP and Friends"
+.IX Subsection "Declaring @EXPORT_OK and Friends"
+When using \f(CW\*(C`Exporter\*(C'\fR with the standard \f(CW\*(C`strict\*(C'\fR and \f(CW\*(C`warnings\*(C'\fR
+pragmas, the \f(CW\*(C`our\*(C'\fR keyword is needed to declare the package
+variables \f(CW@EXPORT_OK\fR, \f(CW@EXPORT\fR, \f(CW@ISA\fR, etc.
+.PP
+.Vb 2
+\& our @ISA = qw(Exporter);
+\& our @EXPORT_OK = qw(munge frobnicate);
+.Ve
+.PP
+If backward compatibility for Perls \fBunder\fR 5.6 is important,
+one must write instead a \f(CW\*(C`use vars\*(C'\fR statement.
+.PP
+.Vb 3
+\& use vars qw(@ISA @EXPORT_OK);
+\& @ISA = qw(Exporter);
+\& @EXPORT_OK = qw(munge frobnicate);
+.Ve
+.SS "Playing Safe"
+.IX Subsection "Playing Safe"
+There are some caveats with the use of runtime statements
+like \f(CW\*(C`require Exporter\*(C'\fR and the assignment to package
+variables, which can be very subtle for the unaware programmer.
+This may happen for instance with mutually recursive
+modules, which are affected by the time the relevant
+constructions are executed.
+.PP
+The ideal way to never have to think about that is to use
+\&\f(CW\*(C`BEGIN\*(C'\fR blocks and the simple import method. So the first part
+of the "SYNOPSIS" code could be rewritten as:
+.PP
+.Vb 1
+\& package YourModule;
+\&
+\& use strict;
+\& use warnings;
+\&
+\& use Exporter \*(Aqimport\*(Aq;
+\& BEGIN {
+\& our @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+\& }
+.Ve
+.PP
+Or if you need to inherit from Exporter:
+.PP
+.Vb 1
+\& package YourModule;
+\&
+\& use strict;
+\& use warnings;
+\&
+\& BEGIN {
+\& require Exporter;
+\& our @ISA = qw(Exporter); # inherit all of Exporter\*(Aqs methods
+\& our @EXPORT_OK = qw(munge frobnicate); # symbols to export on request
+\& }
+.Ve
+.PP
+The \f(CW\*(C`BEGIN\*(C'\fR will assure that the loading of \fIExporter.pm\fR
+and the assignments to \f(CW@ISA\fR and \f(CW@EXPORT_OK\fR happen
+immediately like \f(CW\*(C`use\*(C'\fR, leaving no room for something to get awry
+or just plain wrong.
+.PP
+With respect to loading \f(CW\*(C`Exporter\*(C'\fR and inheriting, there
+are alternatives with the use of modules like \f(CW\*(C`base\*(C'\fR and \f(CW\*(C`parent\*(C'\fR.
+.PP
+.Vb 3
+\& use base qw(Exporter);
+\& # or
+\& use parent qw(Exporter);
+.Ve
+.PP
+Any of these statements are nice replacements for
+\&\f(CW\*(C`BEGIN { require Exporter; our @ISA = qw(Exporter); }\*(C'\fR
+with the same compile-time effect. The basic difference
+is that \f(CW\*(C`base\*(C'\fR code interacts with declared \f(CW\*(C`fields\*(C'\fR
+while \f(CW\*(C`parent\*(C'\fR is a streamlined version of the older
+\&\f(CW\*(C`base\*(C'\fR code to just establish the IS-A relationship.
+.PP
+For more details, see the documentation and code of
+base and parent.
+.PP
+Another thorough remedy to that runtime
+vs. compile-time trap is to use Exporter::Easy,
+which is a wrapper of Exporter that allows all
+boilerplate code at a single gulp in the
+use statement.
+.PP
+.Vb 5
+\& use Exporter::Easy (
+\& OK => [ qw(munge frobnicate) ],
+\& );
+\& # @ISA setup is automatic
+\& # all assignments happen at compile time
+.Ve
+.SS "What Not to Export"
+.IX Subsection "What Not to Export"
+You have been warned already in "Selecting What to Export"
+to not export:
+.IP \(bu 4
+method names (because you don't need to
+and that's likely to not do what you want),
+.IP \(bu 4
+anything by default (because you don't want to surprise your users...
+badly)
+.IP \(bu 4
+anything you don't need to (because less is more)
+.PP
+There's one more item to add to this list. Do \fBnot\fR
+export variable names. Just because \f(CW\*(C`Exporter\*(C'\fR lets you
+do that, it does not mean you should.
+.PP
+.Vb 1
+\& @EXPORT_OK = qw($svar @avar %hvar); # DON\*(AqT!
+.Ve
+.PP
+Exporting variables is not a good idea. They can
+change under the hood, provoking horrible
+effects at-a-distance that are too hard to track
+and to fix. Trust me: they are not worth it.
+.PP
+To provide the capability to set/get class-wide
+settings, it is best instead to provide accessors
+as subroutines or class methods instead.
+.SH "SEE ALSO"
+.IX Header "SEE ALSO"
+\&\f(CW\*(C`Exporter\*(C'\fR is definitely not the only module with
+symbol exporter capabilities. At CPAN, you may find
+a bunch of them. Some are lighter. Some
+provide improved APIs and features. Pick the one
+that fits your needs. The following is
+a sample list of such modules.
+.PP
+.Vb 6
+\& Exporter::Easy
+\& Exporter::Lite
+\& Exporter::Renaming
+\& Exporter::Tidy
+\& Sub::Exporter / Sub::Installer
+\& Perl6::Export / Perl6::Export::Attrs
+.Ve
+.SH LICENSE
+.IX Header "LICENSE"
+This library is free software. You can redistribute it
+and/or modify it under the same terms as Perl itself.