NAME
Perinci::Import - Import functions from another module
VERSION
version 0.02
SYNOPSIS
# import some functions
use Perinci::Import 'Some::Module', 'func1', 'func2';
# import wrapped function
use Perinci::Import 'Some::Function', func1 => {retry => 3};
# import all (public) functions
use Perinci::Import 'Some::Module', ':all';
DESCRIPTION
This module is the counterpart of Perinci::Exporter (with slightly
incompatible semantic in syntax). It lets you import functions from
another modules. Imported modules need not define an exporter; the list
of importable functions, their tags, etc are consulted from Rinci
metadata (located in %SPEC package variable). Other features include:
wrapping functions, importing to another name, etc.
"Perinci::Import" is now preferred over "Perinci::Exporter" as this
frees module authors from specifying an exporter explicitly. Personally,
I also use the venerable Exporter on some modules.
IMPORTING
The basic syntax is:
use Perinci::Import <MODULE::NAME> [FUNC | FUNC => \%OPTS, ...]
Default exports. If you specify no arguments:
use Perinci::Import 'Some::Module';
this will import all functions having the "default" tag. For example:
package Some::Module;
our %SPEC;
$SPEC{func1} = { v=>1.1, tags=>[qw/default a/] };
sub func1 { ... }
$SPEC{func2} = { v=>1.1, tags=>[qw/default a b/] };
sub func2 { ... }
$SPEC{func3} = { v=>1.1, tags=>[qw/b c/] };
sub func3 { ... }
1;
"Some::Module" will by default export "f1" and "f2".
Importing individual functions. You can import individual functions:
use Perinci::Import 'Some::Module', qw(f1 f2);
Each function can have import options, specified in a hashref:
# this imports f1 and f2 (as bar)
use Perinci::Import 'Some::Module', f1 => {args_as=>'array'}, f2=>{-as=>'bar'};
Each import key, unless those prefixed by dash ("-") will be passed to
the "convert" argument of Perinci::Sub::Wrapper's "wrap_sub()". Function
will be wrapped if one of more such arguments are specified (or "-wrap
=> 1" is given. In the above example, "f1" is wrapped because "args_as"
is specified. "f2" is not wrapped.
Importing groups of functions by tags. You can import groups of
functions using tags. Tags are collected from function metadata, and
written with a ":" prefix (to differentiate them from function names).
Each tag can also have import options:
use YourModule 'f3', ':a' => {-prefix => 'a_'}; # imports f3, a_f1, a_f2
Some tags are defined automatically: ":default", ":all".
Importing to a different name. As can be seen from previous examples,
the "-as" and "-prefix" (and also "-suffix") import options can be used
to import subroutines using into a different name.
FAQ
TODO/IDEAS
* Support combining tags?
use Perinci::Import 'Some::Module', qw(not(:tag1));
use Perinci::Import 'Some::Module', qw(and(:tag1,:tag2));
use Perinci::Import 'Some::Module', qw(or(:tag1,and(:tag2,:tag3)));
* Export non-functions (variables, etc).
SEE ALSO
Perinci, Perinci::Exporter
Sub::Exporter
HOMEPAGE
Please visit the project's homepage at
<https://metacpan.org/release/Perinci-Import>.
SOURCE
Source repository is at
<https://github.com/sharyanto/perl-Perinci-Import>.
BUGS
Please report any bugs or feature requests on the bugtracker website
<https://rt.cpan.org/Public/Dist/Display.html?Name=Perinci-Import>
When submitting a bug or request, please include a test-file or a patch
to an existing test-file that illustrates the bug or desired feature.
AUTHOR
Steven Haryanto <stevenharyanto@gmail.com>
COPYRIGHT AND LICENSE
This software is copyright (c) 2014 by Steven Haryanto.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.