The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

NAME

Export::XS - Replacement for Exporter.pm + const.pm in XS, with C++ API.

SYNOPSIS

Exporting functions

    package MyModule;
    use Export::XS::Auto;
    
    sub mysub { ... }
    sub mysub2 { ... }
    
    1;
    
    package Somewhere;
    use MyModule qw/mysub mysub2/;
    
    mysub();
    

Creating and using constants (without export)

    package MyModule;
    
    use Export::XS
        CONST1 => 1,
        CONST2 => 'string';
    
    say CONST1;
    say CONST2;

Creating and using constants with export

    package MyModule;
    
    use Export::XS::Auto {
        CONST1 => 1,
        CONST2 => 'string',
    };
    
    say CONST1;
    say CONST2;
    
    package Somewhere;
    
    use MyModule;
    
    say CONST1;
    say CONST2;
    

C SYNOPSIS

    #include <xs/export.h>
    using namespace xs::exp;
    
    // one-by-one
    create_constant(stash, "STATUS_OFF",       0);
    create_constant(stash, "STATUS_ACTIVE",    1);
    create_constant(stash, "STATUS_SUSPENDED", 2);
    create_constant(stash, "STATUS_PENDING",   3);
    create_constant(stash, "DEFAULT_NAME", "john");
    create_constant(stash, "CONST_NAME", value_sv);
    autoexport(stash);
    
    // bulk 
    create_constants(stash, {
        {"STATUS_OFF",       0},
        {"STATUS_ACTIVE",    1},
        {"STATUS_SUSPENDED", 2},
        {"STATUS_PENDING",   3},
        {"DEFAULT_NAME", "john"}
    });
    
    // exporting subs
    export_sub(from_stash, to_stash, "myfunc");
    
    // export all constants
    export_constants(from, to);

DESCRIPTION

It's very fast not only in runtime but at compile time as well. That means you can create and export/import a lot of constants/functions without slowing down the startup.

You can create constants by saying

    use Export::XS {CONST_NAME1 => VALUE1, ...};
    use Export::XS CONST_NAME1 => VALUE1, ... ;

If you want your class to able to export constants or functions, use Export::XS::Auto instead of Export::XS.

Exports specified constants and functions to caller's package.

    use MyModule qw/subs list/;

Exports nothing

    use MyModule();
    

Exports all constants only (no functions)

    use MyModule;

Exports functions sub1 and sub2 and all constants

    use MyModule qw/sub1 sub2 :const/;

If Export::XS discovers name collision while creating or exporting functions or constants it raises an exception. If you specify wrong sub or const name in import list an exception will also be raisen.

C FUNCTIONS

API is thread-safe. Sv, Stash, and so on is SVAPI classes (Perl C++ API), see XS::Framework. string_view is a panda::string_view which is implementation of C++17's string_view, see XS::libpanda.

    struct Constant {
        Constant (string_view name, const Sv& val);
        Constant (string_view name, string_view val);
        Constant (string_view name, int64_t val);
    };

void create_constant (Stash stash, string_view name, const Sv& value)

void create_constant (Stash stash, string_view name, string_view value)

void create_constant (Stash stash, string_view name, int64_t value)

Creates constant with name name and value value in package stash. Croaks if package already has sub/constant with that name.

void create_constant (Stash stash, const Constant& constant)

Creates constant with name constant.name and value <constant.value> in stash.

void create_constants (Stash stash, const std::initializer_list<Constant>& constants)

Creates a constant for each element in constants.

void create_constants (Stash stash, const Hash& constants)

Creates a constant for each key/value pair in constants.

void create_constants (Stash stash, SV*const* list, size_t items)

Creates a constant for each key/value pair in array list. It means that list[0] is a key, list[1] is a value, list[2] is a key, etc... Array should not contain empty slots and empty keys or it will croak. If elements count is odd, last element is ignored. You must pass the size of list in items.

void autoexport (Stash stash)

Makes stash autoexport its constants when someone says

    use ThatClass; # ThatClass is stash.name()

void export_sub (const Stash& from, Stash to, string_view name)

Exports sub/constant with name name from package from to package <to>.

void export_constants (const Stash& from, Stash to)

Exports all constants from package from to package <to>.

void register_export (const Stash& stash, string_view name)

Forces an export of a function with specified name by default (along with constants), i.e. when user says

    use SomeClass;

Array constants_list (const Stash& stash)

Returns the list of all constants defined in package stash as a perl array.

PERFOMANCE

Export::XS is up to 10x faster than const.pm and Exporter.pm at compile-time. The runtime perfomance is the same as it doesn't depend on this module.

AUTHOR

Pronin Oleg <syber@cpan.org>, Crazy Panda LTD

LICENSE

You may distribute this code under the same terms as Perl itself.