5 our @ISA = qw(Exporter);
14 # Do that crazy multi-word identifier completion thing:
16 if ($re !~ /[^\w\d_^:]/) {
17 $re =~ s/(?<=[A-Za-z\d])([^A-Za-z\d])/[A-Za-z\\d]*$1+/g;
22 =item C<completions($string)>
29 my ($str, $pack) = @_;
30 if (my ($pfx, $name) = $str =~ /^([\%\$\@]?)(.+)/) {
31 my @nameparts = split /:+/, $name;
32 if (@nameparts == 1 && $pack) {
33 @nameparts = (split(/:+/, $pack), $name);
35 local *_completions
= sub {
37 my ($stash, $part, @rest) = @_;
38 $part = join '[^_]*_', split /_/, $part;
39 $part = _apropos_re
($part);
42 _completions
("$stash$_", @rest)
43 } grep /^$part.*\::$/, keys %$stash;
45 map { "$stash$_" } grep /^$part/, keys %$stash;
49 my $type = ($pfx eq '$' ?
'SCALAR'
50 : $pfx eq '@' ?
'ARRAY'
51 : $pfx eq '&' ?
'CODE'
52 : $pfx eq '%' ?
'HASH'
57 !$type || defined(*{$_}{$type})
58 } _completions
('::', @nameparts);
62 =item C<location($name)>
71 if (my ($pfx, $name) = $str =~ /^([\%\$\@]?)(.+)/) {
73 print STDERR
"Sorry -- can't lookup variables.";
76 my $cv = B
::svref_2object
(\
&{$name});
77 if ($cv && ($cv = $cv->START) && !$cv->isa('B::NULL')) {
78 my ($file, $line) = ($cv->file, $cv->line);
87 my ($shortname) = $name =~ /^(?:.*::)([^:]+)$/;
88 [Cwd
::abs_path
($file), $line, $shortname]
97 =item C<apropos($name [, $is_regex])>
105 if ($it =~ /^(.*::)([^:]+)$/) {
106 my ($stash, $name) = @_;
108 my $name = qr/$name/;
113 /$name/ && defined &{"$stash$name"}
116 defined &$it ?
$it : ();
120 my $findre = $re ?
qr/$it/ : qr/^\Q$it\E$/;
121 print STDERR
"Searching for $findre...";
123 push @ret, "$stash$_" if /$findre/;
125 map { s/^:://;$_ } @ret;
129 sub my_walksymtable
(&*)
135 &$f for keys %$stash;
136 _walk
("$stash$_") for grep /(?<!main)::$/, keys %$stash;
141 =item C<mod_subs($pack)>
143 Find subs in package C<$pack>.
151 my $stash = \
%{"$p\::"};
152 if (defined $stash) {
153 grep { defined &{"$p\::$_"} } keys %$stash;
157 =item C<mod_decls($pack)>
159 Generate a list of declarations for all subroutines in package
170 my $proto = prototype(\
&{"$pack\::$sn"});
171 $proto = defined($proto) ?
"($proto)" : '';
174 return wantarray ?
@ret : join '', @ret;
177 =item C<module_info($module, $type)>
179 Emacs-called function to get module information.
188 $info = Module
::Info
->new_from_file($m);
190 (my $file = $m) =~ s
|::|/|g
;
192 if (exists $INC{$file}) {
193 $info = Module
::Info
->new_from_loaded($m);
195 $info = Module
::Info
->new_from_module($m);