NAME

Sub::Inject - Inject subroutines into a lexical scope

VERSION

version 0.3.0

SYNOPSIS

use Sub::Inject;   # requires perl 5.18+

{
    BEGIN { Sub::Inject::sub_inject( 'one', sub { say "One!" } ); }
    one();
}

one();    # throws "Undefined subroutine &main::one called"

DESCRIPTION

This module allows to dynamically inject lexical subs during compilation. It is implemented using lexical subroutines introduced in perl 5.18.

This is a low level library. It is meant for cases where subroutine names and bodies are to be treated as data or not known in advance. Otherwise, lexical subs syntax is recommended. For instance,

use experimental qw(lexical_subs);
state sub foo { say "One!" }

is the static equivalent of

BEGIN {
    Sub::Inject::sub_inject( 'one', sub { say "One!" } );
}

HOW IT WORKS

Used like

BEGIN { Sub::Inject::sub_inject('foo', sub { ... }) }

it works as

\state &foo = sub { ... };

That means:

  • The scope behavior is the same as the lexical sub statement

  • Being a "state" lexical guarantees the persistence of the association between the name and the subroutine

  • The reference aliasing operation means no copy is done

FUNCTIONS

sub_inject

sub_inject($name, $code);
sub_inject($name1, $code1, $name2, $code2);
sub_inject(\%subs);

Injects $code as a lexical subroutine named $name into the currently compiling scope. The same applies to multiple name / code pairs given as input.

Throws an error if called at runtime.

ACKNOWLEDGEMENTS

This code is a fork of "Lexical.xs" file from Exporter-Lexical distribution by Jesse Luehrs.

SEE ALSO

"Lexical Subroutines" in perlsub

"The 'lexical_subs' feature" in feature

Exporter::Lexical and lexically

AUTHOR

Adriano Ferreira <ferreira@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2017 by Adriano Ferreira.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.