NAME
Export::Declare - Declarative Exporting, successor of Exporter-Declare.
DESCRIPTION
Declare exports instead of using package vars. Successor to Exporter::Declare which was over complicated. Fully compatible with Importer and Exporter.
SYNOPSYS
DECLARING EXPORTS
package
My::Exporter;
# You should do one of these, if you do not then 'vars' will be selected
# automatically.
export_meta->inject_menu;
# Define IMPORTER_MENU
# and/or
export_meta->inject_vars;
# Define @EXPORT and friends
# Export an anonymous sub
export
foo
=>
sub
{
'foo'
};
# Export package subs
exports
qw/bar baz/
;
# Default export
export_tag
DEFAULT
=>
qw/bat/
;
# Define the subs you are exporting
sub
bar {
'bar'
}
sub
baz {
'baz'
}
sub
bat {
'bat'
}
CONSUMING EXPORTS
if the exporter imported import()
from Export::Declare then you can use it directly, but this is discouraged.
USE + IMPORT
You can use Export::Declare directly to bring in the tools. You can specify -menu
and/or -vars
to inject IMPORTER_MENU()
and/or @EXPORT
and friends.
EXPORTS
All exports are optinal, none are exported by default.
- my $meta = export_meta()
-
Get the meta-object for the current package.
This is litterally:
sub
export_meta { Export::Declare::Meta->new(
scalar
caller
) }
- export $NAME
- export $NAME => $REF
-
Export the specified symbol. if
$REF
is specified then it will be used as the export. If$REF
is not specified then the ref will be pulled from the symbol table for the current package.$NAME
can be a function name, or a symbol name such as'$FOO'
.$REF
if provided must be the same type as the sigil in$NAME
. if$NAME
has no sigil then&
is assumed. - exports @NAMES
-
@NAMES
is a list of symbol names. A symbol name can be a function name without a sigil, or it can be any type of veriable with a sigil. - export_tag $TAG => @NAMES
-
$TAG
can be any valid tag name (same as any variable name, must start with a word character, and contain only word characters and numbers.@NAMES
is a list of symbol names. A symbol name can be a function name without a sigil, or it can be any type of veriable with a sigil.The
:DEFAULT
tag is linked to@EXPORT
when the meta-data is linked with package vars.The
:FAIL
tag is linked to@EXPORT_FAIL
when the meta-data is linked with package vars.The
:ALL
tag is linked to@EXPORT_OK
when the meta-data is linked with package vars. All exports are added to this tag automatically. - export_gen $NAME => \&GENERATOR
- export_gen $NAME => $GENERATOR
-
Specify that
$NAME
should be exported, and that the$REF
should be generated dynamically using the specified sub. This sub will be used every time something imports$NAME
.$NAME
can be a function name, or a symbol name such as'$FOO'
.$REF
if provided must be the same type as the sigil in$NAME
. if$NAME
has no sigil then&
is assumed.The second argument can be a reference to a subroutine, or it can be the name of a sub to call on the current package.
The sub gets several arguments:
export_gen
foo
=>
sub
{
my
(
$from_package
,
$into_package
,
$symbol_name
) =
@_
;
...
return
$REF
;
};
export_gen
bar
=>
'_gen_bar'
'
sub
_gen_bar {
my
(
$from_package
,
$into_package
,
$symbol_name
) =
@_
;
...
return
$REF
;
}
- export_magic $NAME => sub { ... }
-
This allows you to define custom actions to run AFTER an export has been injected into the consumers namespace. This is a good place to enable parser hooks like with Devel::Declare.
export_magic
foo
=>
sub
{
my
$from
=
shift
;
# Should be the package doing the exporting
my
%args
=
@_
;
my
$into
=
$args
{into};
# Package symbol was exported into
my
$orig_name
=
$args
{orig_name};
# Original name of the export (in the exporter)
my
$new_name
=
$args
{new_name};
# Name the symbol was imported as
my
$ref
=
$args
{
ref
};
# The reference to the symbol
...;
# whatever you want, return is ignored.
};
- $CLASS->import(@NAMES)
-
This is an optinal
import()
method you can pull into your exporter so that people can consume your exports by directly using your module.package
My::Exporter;
export
foo
=>
sub
{
'foo'
};
...
package
My::Consumer;
This is discouraged! it is better if you omit
import()
and have people do this to get your exports:package
My::Consumer;
DETAILS
This package tracks exports in a meta class. The meta-class is Export::Declare::Meta. All the exports act on the meta-object for the package that calls them. Having this meta-data on its own does not actually make your module an exporter, for that to happen you need to expose the meta-data in a way that Exporter or Importer know how to find it.
export_meta->inject_vars;
export_meta->inject_menu;
inject_vars
will inject @EXPORT
, @EXPORT_OK
and other related vars. These vars will be directly linked to the meta-object.
inject_menu
injects the IMPORTER_MENU()
function that exposes the meta-data.
If you do not specify one, then vars
will be selected for you automatically the first time you use an export function.
SOURCE
The source code repository for Export-Declare can be found at http://github.com/exodist/Export-Declare/.
MAINTAINERS
AUTHORS
COPYRIGHT
Copyright 2015 Chad Granum <exodist7@gmail.com>.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
See http://dev.perl.org/licenses/