e4a1680f08c763e43a6011e8e3734c769d152a73
[p5sagit/Devel-REPL.git] / lib / Devel / REPL / Plugin / FindVariable.pm
1 use strict;
2 use warnings;
3 package Devel::REPL::Plugin::FindVariable;
4
5 our $VERSION = '1.003027';
6
7 use Devel::REPL::Plugin;
8 use namespace::autoclean;
9
10 sub find_variable {
11     my ($self, $name) = @_;
12
13     return \$self if $name eq '$_REPL';
14
15     # XXX: this code needs to live in LexEnv
16     if ($self->can('lexical_environment')) {
17         return \( $self->lexical_environment->get_context('_')->{$name} )
18             if exists $self->lexical_environment->get_context('_')->{$name};
19     }
20
21     my $sigil = $name =~ s/^([\$\@\%\&\*])// ? $1 : '';
22
23     my $default_package = $self->can('current_package')
24                         ? $self->current_package
25                         : 'main';
26     my $package = $name =~ s/^(.*)(::|')// ? $1 : $default_package;
27
28     my $meta = Class::MOP::Class->initialize($package);
29
30     # Class::MOP::Package::has_package_symbol method *requires* a sigil
31     return unless length($sigil) and $meta->has_package_symbol("$sigil$name");
32     $meta->get_package_symbol("$sigil$name");
33 }
34
35 1;
36
37 __END__
38
39 =head1 NAME
40
41 Devel::REPL::Plugin::FindVariable - Finds variables by name
42
43 =head1 AUTHOR
44
45 Shawn M Moore, C<< <sartak at gmail dot com> >>
46
47 =cut
48