File: InlineModule.pm

package info (click to toggle)
libmodule-reader-perl 0.003003-1
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster
  • size: 120 kB
  • sloc: perl: 358; makefile: 2
file content (53 lines) | stat: -rw-r--r-- 998 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package InlineModule;
use strict;
use warnings;

BEGIN {
  *_HAS_PERLIO = "$]" >= 5.008_000 ? sub(){1} : sub(){0};
}

sub import {
  my ($class, %modules) = @_;
  unshift @INC, inc_hook(%modules)
    if %modules;
}

sub inc_hook {
  my (%modules) = @_;
  my %files = map {
    (my $file = "$_.pm") =~ s{::}{/}g;
    $file => $modules{$_};
  } keys %modules;

  sub {
    return
      unless exists $files{$_[1]};
    my $module = $files{$_[1]};
    if (!defined $module) {
      die "Can't locate $_[1] in \@INC (hidden) (\@INC contains: @INC).\n";
    }
    inc_module($module);
  }
}

sub inc_module {
  my $code = $_[0];
  if (_HAS_PERLIO) {
    open my $fh, '<', \$code
      or die "error loading module: $!";
    return $fh;
  }
  else {
    my $pos = 0;
    my $last = length $code;
    return (sub {
      return 0 if $pos == $last;
      my $next = (1 + index $code, "\n", $pos) || $last;
      $_ .= substr $code, $pos, $next - $pos;
      $pos = $next;
      return 1;
    });
  }
}

1;