NAME

Sub::Replace - Replace subroutines in packages with controlled effects

VERSION

version 0.2.0

SYNOPSIS

    use Sub::Replace;

    sub one { say 'One' }

    one(); # One

    BEGIN { Sub::Replace::sub_replace('one', sub { say 'Uno' }); }

    one(); # Uno

    BEGIN { Sub::Replace::sub_replace('one', sub { say 'Eins' }); }

    one(); # Eins

DESCRIPTION

In Perl, replacing a subroutine in a symbol table is as easy as doing:

    *TargetPackage::target_sub = sub { ... };

However that may cause a lot of trouble for compiled code with mentions to \&target_sub. For example,

    sub one { say 'One' }
    one();
    BEGIN { *one = sub { say 'Uno' }; }
    one();
    BEGIN { *one = sub { say 'Eins' }; }
    one();

will not output

    One
    Uno
    Eins

but

    Eins
    Eins
    Eins

This module provides a sub_replace function to address that.

FUNCTIONS

Sub::Replace implements the following functions, which are exportable.

sub_replace

    $old = Sub::Replace::sub_replace($name, $code);
    $old = Sub::Replace::sub_replace($name1, $code1, $name2, $code2);
    $old = Sub::Replace::sub_replace(\%subs);

The sub name may be fully qualified (eg. 'TargetPackage::target_sub') or not (like 'target_sub'). In the latter case, the caller package will be used.

The return is a hash ref which maps the fully qualified names into the previously installed subroutines (or undef if none were there). This is suitable to undo a previous sub_replace by calling

    Sub::Replace::sub_replace($old);

CAVEATS

The same as mentioned in "LIMITATIONS" in Sub::Delete, namely: you may be surprised by taking references to globs in between calls to sub_replace.

SEE ALSO

Sub::Delete

AUTHOR

Adriano Ferreira <ferreira@cpan.org>

COPYRIGHT AND LICENSE

This software is copyright (c) 2017-2018 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.