From: Sartak Date: Sun, 25 May 2008 20:47:52 +0000 (+0000) Subject: CompletionDriver::Methods which currently only works on classnames X-Git-Tag: v1.003015~105 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=23d2a2acf0a2d24e97d6fad3fc96ca0bc0ff32b1;p=p5sagit%2FDevel-REPL.git CompletionDriver::Methods which currently only works on classnames git-svn-id: http://dev.catalyst.perl.org/repos/bast/trunk/Devel-REPL@4404 bd8105ee-0ff8-0310-8827-fb3f25b6796d --- diff --git a/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm b/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm new file mode 100644 index 0000000..14e0fcc --- /dev/null +++ b/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm @@ -0,0 +1,48 @@ +package Devel::REPL::Plugin::CompletionDriver::Methods; +use Devel::REPL::Plugin; +use namespace::clean -except => [ 'meta' ]; + +around complete => sub { + my $orig = shift; + my ($self, $text, $document) = @_; + + my $last = $self->last_ppi_element($document); + my $incomplete = ''; + + # handle an incomplete method name, and back up to the -> + if ($last->isa('PPI::Token::Word')) { + my $previous = $last->sprevious_sibling + or return $orig->(@_); + $previous->isa('PPI::Token::Operator') && $previous->content eq '->' + or return $orig->(@_); + $incomplete = $last->content; + $last = $previous; + } + + # require a -> here + return $orig->(@_) + unless $last->isa('PPI::Token::Operator') + && $last->content eq '->'; + + # ..which is preceded by a word (class name) + my $previous = $last->sprevious_sibling + or return $orig->(@_); + $previous->isa('PPI::Token::Word') + or return $orig->(@_); + my $class = $previous->content; + + # now we have $class->$incomplete + + my $metaclass = Class::MOP::Class->initialize($class); + + my $re = qr/^\Q$incomplete/; + + return $orig->(@_), + grep { $_ =~ $re } + map { $_->{name} } + $metaclass->compute_all_applicable_methods; +}; + +1; + +