X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDevel%2FREPL%2FPlugin%2FCompletionDriver%2FMethods.pm;h=88afd5e6fc712ef1251cee04cce9088ea023f330;hb=2c1cf68730092df9d48a6115d03be122b0c3ba55;hp=14e0fcce765c8cd7b54b979bbc6b3d06b34c8cb5;hpb=23d2a2acf0a2d24e97d6fad3fc96ca0bc0ff32b1;p=p5sagit%2FDevel-REPL.git diff --git a/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm b/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm index 14e0fcc..88afd5e 100644 --- a/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm +++ b/lib/Devel/REPL/Plugin/CompletionDriver/Methods.pm @@ -1,6 +1,13 @@ package Devel::REPL::Plugin::CompletionDriver::Methods; use Devel::REPL::Plugin; -use namespace::clean -except => [ 'meta' ]; +use namespace::autoclean; + +sub BEFORE_PLUGIN { + my $self = shift; + for (qw/Completion FindVariable/) { + $self->load_plugin($_); + } +} around complete => sub { my $orig = shift; @@ -27,9 +34,20 @@ around complete => sub { # ..which is preceded by a word (class name) my $previous = $last->sprevious_sibling or return $orig->(@_); - $previous->isa('PPI::Token::Word') + $previous->isa('PPI::Token::Word') || $previous->isa('PPI::Token::Symbol') or return $orig->(@_); - my $class = $previous->content; + my $class; + + # we have a variable, need to look up its class + if ($previous->isa('PPI::Token::Symbol')) { + my $object_ref = $self->find_variable($previous->content) + or return $orig->(@_); + $class = blessed($$object_ref) + or return $orig->(@_); + } + else { + $class = $previous->content; + } # now we have $class->$incomplete @@ -39,10 +57,21 @@ around complete => sub { return $orig->(@_), grep { $_ =~ $re } - map { $_->{name} } - $metaclass->compute_all_applicable_methods; + map { $_->name } + $metaclass->get_all_methods; }; 1; +__END__ + +=head1 NAME + +Devel::REPL::Plugin::CompletionDriver::Methods - Complete class or object method names + +=head1 AUTHOR + +Shawn M Moore, C<< >> + +=cut