FindVariable plugin, which returns a reference to a global variable by name
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / CompletionDriver / Methods.pm
CommitLineData
23d2a2ac 1package Devel::REPL::Plugin::CompletionDriver::Methods;
2use Devel::REPL::Plugin;
3use namespace::clean -except => [ 'meta' ];
4
5around complete => sub {
6 my $orig = shift;
7 my ($self, $text, $document) = @_;
8
9 my $last = $self->last_ppi_element($document);
10 my $incomplete = '';
11
12 # handle an incomplete method name, and back up to the ->
13 if ($last->isa('PPI::Token::Word')) {
14 my $previous = $last->sprevious_sibling
15 or return $orig->(@_);
16 $previous->isa('PPI::Token::Operator') && $previous->content eq '->'
17 or return $orig->(@_);
18 $incomplete = $last->content;
19 $last = $previous;
20 }
21
22 # require a -> here
23 return $orig->(@_)
24 unless $last->isa('PPI::Token::Operator')
25 && $last->content eq '->';
26
27 # ..which is preceded by a word (class name)
28 my $previous = $last->sprevious_sibling
29 or return $orig->(@_);
30 $previous->isa('PPI::Token::Word')
31 or return $orig->(@_);
32 my $class = $previous->content;
33
34 # now we have $class->$incomplete
35
36 my $metaclass = Class::MOP::Class->initialize($class);
37
38 my $re = qr/^\Q$incomplete/;
39
40 return $orig->(@_),
41 grep { $_ =~ $re }
42 map { $_->{name} }
43 $metaclass->compute_all_applicable_methods;
44};
45
461;
47
48