Evo::Export
version 0.0213
Standart Exporter wasn't good enough for me, so I've written a new one from the scratch
# need separate file My/Lib.pm package My::Lib; use Evo '-Export *'; # export foo sub foo : Export { say 'foo' } # export other as bar sub other : Export(bar) { say 'bar' } # test.pl package main; use Evo 'My::Lib *'; foo(); bar();
use Evo; use Evo 'Evo::Eval eval_try'; use Evo '-Promise promise deferred';
For convenient, you can load all above in one line
use Evo '-Eval eval_try; -Promise promise deferred';
* means load all. - is a shortcut. See ""shortcuts" in Evo
*
-
You can rename subroutines to avoid method clashing
# import promise as prm use Evo '-Promise promise:prm';
You can use * with exclude - for convinient
# import all except "deferred" use Evo '-Promise *, -deferred';
If one name clashes with yours, you can import all except that name and import renamed version of that name
# import all as is but only deferred will be renamed to "renamed_deferred" use Evo '-Promise *, -deferred, deferred:renamed_deferred';
Using attribute Export
Export
package main; use Evo; { package My::Lib; use Evo -Loaded; # don't needed in the real code use Evo '-Export *'; sub foo : Export {say 'foo'} } use Evo 'My::Lib foo'; foo();
Pay attention that module should export '*', to install all unneccessary stuff, including MODIFY_CODE_ATTRIBUTES and import. But if you want, you can import them by hand, and this isn't recommended
MODIFY_CODE_ATTRIBUTES
import
You can export with another name
# export as bar sub foo : Export(bar) {say 'foo'}
Export signature is more preffered way, but if you wish
# export foo export 'foo'; # export "foo" under name "bar" export 'foo:bar';
Trying to export not existing subroitine will cause an exception
Export function, that won't be available in the source class
# My::Lib now exports foo, but My::Lib::foo doesn't exist export_anon foo => sub { say "hello" };
# reexport all from My::Other export_proxy 'My::Other', '*'; # reexport "foo" from My::Other export_proxy 'My::Other', 'foo'; # reexport "foo" from My::Other as "bar" export_proxy 'My::Other', 'foo:bar';
package main; use Evo; { # BEGIN and Loaded only for copy-paste example package My::Lib; use Evo '-Export *; -Loaded'; export_gen foo => sub ($class) { say "$class requested me"; sub {"hello, $class"}; }; }; My::Lib->import('*'); foo();
Very powefull and most exciting feature. Evo::Export exports generators, that produces subroutines. Consider it as a 3nd dimension in 3d programming
Implementation garanties that one module will get the same (cashed) generated unit (if it'l import twice or import from module that reimport the same thing), but different module will get another one
use Evo 'Evo::Class has'; use Evo 'Evo::Class has';
has was imported twice, but generated only once. If some class will do something export_proxy 'Evo::Class', 'has', you can export that has and it will be the same subroutine
has
export_proxy 'Evo::Class', 'has'
For example, you can use it to check, if requester class has some methods and than use it directly, if $self->method() isn't good choise
$self->method()
export_gen foo => sub ($class) { my $method = $class->can("name") or die "provide name"; sub { say $method->() }; };
By default, this method will be exported and do the stuff. If you need replace import of your module, exclude it by use Evo '-Export *, -import'
use Evo '-Export *, -import'
use Evo '-Export *, -import, import_all:import';
Just like /import but treats empty list as '*'.
/import
alexbyk.com
This software is copyright (c) 2016 by alexbyk.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
To install Evo, copy and paste the appropriate command in to your terminal.
cpanm
cpanm Evo
CPAN shell
perl -MCPAN -e shell install Evo
For more information on module installation, please visit the detailed CPAN module installation guide.