Expose scan_ident to perl space.
[p5sagit/Devel-Declare.git] / lib / Devel / Declare / Context / Simple.pm
CommitLineData
e7be1784 1package Devel::Declare::Context::Simple;
2
3use Devel::Declare ();
b0a89632 4use B::Hooks::EndOfScope;
e7be1784 5use strict;
6use warnings;
7
8sub new {
5b27c9b2 9 my $class = shift;
10 bless {@_}, $class;
e7be1784 11}
12
13sub init {
5b27c9b2 14 my $self = shift;
15 @{$self}{ qw(Declarator Offset) } = @_;
ab449c2e 16 return $self;
e7be1784 17}
18
ab449c2e 19sub offset {
20 my $self = shift;
21 return $self->{Offset}
22}
23
24sub inc_offset {
25 my $self = shift;
26 $self->{Offset} += shift;
27}
28
29sub declarator {
30 my $self = shift;
31 return $self->{Declarator}
32}
e7be1784 33
34sub skip_declarator {
5b27c9b2 35 my $self = shift;
ab449c2e 36 $self->inc_offset(Devel::Declare::toke_move_past_token($self->offset));
e7be1784 37}
38
39sub skipspace {
5b27c9b2 40 my $self = shift;
ab449c2e 41 $self->inc_offset(Devel::Declare::toke_skipspace($self->offset));
e7be1784 42}
43
7a3f5539 44sub get_linestr {
45 my $self = shift;
46 my $line = Devel::Declare::get_linestr();
47 return $line;
48}
49
50sub set_linestr {
51 my $self = shift;
52 my ($line) = @_;
53 Devel::Declare::set_linestr($line);
54}
55
e7be1784 56sub strip_name {
5b27c9b2 57 my $self = shift;
58 $self->skipspace;
59 if (my $len = Devel::Declare::toke_scan_word( $self->offset, 1 )) {
7a3f5539 60 my $linestr = $self->get_linestr();
5b27c9b2 61 my $name = substr( $linestr, $self->offset, $len );
62 substr( $linestr, $self->offset, $len ) = '';
7a3f5539 63 $self->set_linestr($linestr);
5b27c9b2 64 return $name;
65 }
b0a89632 66
67 $self->skipspace;
5b27c9b2 68 return;
e7be1784 69}
70
71sub strip_proto {
5b27c9b2 72 my $self = shift;
73 $self->skipspace;
74
7a3f5539 75 my $linestr = $self->get_linestr();
b0a89632 76 if (substr($linestr, $self->offset, 1) eq '(') {
77 my $length = Devel::Declare::toke_scan_str($self->offset);
7a3f5539 78 my $proto = Devel::Declare::get_lex_stuff();
5b27c9b2 79 Devel::Declare::clear_lex_stuff();
7a3f5539 80 if( $length < 0 ) {
81 # Need to scan ahead more
82 $linestr .= $self->get_linestr();
83 $length = rindex($linestr, ")") - $self->offset + 1;
84 }
85 else {
86 $linestr = $self->get_linestr();
87 }
88
b0a89632 89 substr($linestr, $self->offset, $length) = '';
7a3f5539 90 $self->set_linestr($linestr);
91
5b27c9b2 92 return $proto;
93 }
94 return;
e7be1784 95}
96
97sub get_curstash_name {
5b27c9b2 98 return Devel::Declare::get_curstash_name;
e7be1784 99}
100
101sub shadow {
ab449c2e 102 my $self = shift;
5b27c9b2 103 my $pack = $self->get_curstash_name;
104 Devel::Declare::shadow_sub( $pack . '::' . $self->declarator, $_[0] );
e7be1784 105}
106
107sub inject_if_block {
b0a89632 108 my $self = shift;
5b27c9b2 109 my $inject = shift;
b0a89632 110 my $before = shift || '';
111
5b27c9b2 112 $self->skipspace;
b0a89632 113
7a3f5539 114 my $linestr = $self->get_linestr;
b0a89632 115 if (substr($linestr, $self->offset, 1) eq '{') {
116 substr($linestr, $self->offset + 1, 0) = $inject;
117 substr($linestr, $self->offset, 0) = $before;
7a3f5539 118 $self->set_linestr($linestr);
5b27c9b2 119 }
e7be1784 120}
121
122sub scope_injector_call {
b0a89632 123 my $self = shift;
124 my $inject = shift || '';
125 return ' BEGIN { ' . ref($self) . "->inject_scope('${inject}') }; ";
e7be1784 126}
127
128sub inject_scope {
b0a89632 129 my $class = shift;
130 my $inject = shift;
131 on_scope_end {
5b27c9b2 132 my $linestr = Devel::Declare::get_linestr;
b0a89632 133 return unless defined $linestr;
5b27c9b2 134 my $offset = Devel::Declare::get_linestr_offset;
b0a89632 135 substr( $linestr, $offset, 0 ) = ';' . $inject;
5b27c9b2 136 Devel::Declare::set_linestr($linestr);
b0a89632 137 };
e7be1784 138}
139
1401;
b0a89632 141# vi:sw=2 ts=2