Commit | Line | Data |
a0d0e21e |
1 | package Shell; |
2 | |
3 | sub import { |
4 | my $self = shift; |
5 | my ($callpack, $callfile, $callline) = caller; |
6 | my @EXPORT; |
7 | if (@_) { |
8 | @EXPORT = @_; |
9 | } |
10 | else { |
11 | @EXPORT = 'AUTOLOAD'; |
12 | } |
13 | foreach $sym (@EXPORT) { |
14 | *{"${callpack}::$sym"} = \&{"Shell::$sym"}; |
15 | } |
16 | }; |
17 | |
18 | AUTOLOAD { |
19 | my $cmd = $AUTOLOAD; |
20 | $cmd =~ s/^.*:://; |
21 | eval qq { |
22 | sub $AUTOLOAD { |
23 | if (\@_ < 2) { |
24 | `$cmd \@_`; |
25 | } |
26 | else { |
27 | open(SUBPROC, "-|") |
28 | or exec '$cmd', \@_ |
29 | or die "Can't exec $cmd: \$!\n"; |
30 | if (wantarray) { |
31 | my \@ret = <SUBPROC>; |
32 | close SUBPROC; # XXX Oughta use a destructor. |
33 | \@ret; |
34 | } |
35 | else { |
36 | local(\$/) = undef; |
37 | my \$ret = <SUBPROC>; |
38 | close SUBPROC; |
39 | \$ret; |
40 | } |
41 | } |
42 | } |
43 | }; |
44 | goto &$AUTOLOAD; |
45 | } |
46 | |
47 | 1; |