The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.
package Test::LocalFunctions::Util;

use strict;
use warnings;
use Sub::Identify qw/stash_name/;
use Module::Load;

sub list_local_functions {
    my $module = shift;

    my @local_functions;

    no strict 'refs';
    load $module;
    my %package = %{"${module}::"};
    while ( my ( $key, $value ) = each %package ) {
        next unless $key =~ /^_/;
        next unless *{"${module}::${key}"}{CODE};
        next unless $module eq stash_name( $module->can($key) );
        push @local_functions, $key;
    }
    use strict 'refs';

    return @local_functions;
}

sub extract_module_name {
    my $file = shift;

    # e.g.
    #   If file name is `lib/Foo/Bar.pm` then module name will be `Foo::Bar`
    if ( $file =~ /\.pm/ ) {
        my $module = $file;
        $module =~ s!\A.*\blib/!!;
        $module =~ s!\.pm\Z!!;
        $module =~ s!/!::!g;
        return $module;
    }

    return $file;
}
1;