Depend on B::Hooks::EndOfScope 0.05.
[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
c0f4fa58 71sub strip_ident {
72 my $self = shift;
73 $self->skipspace;
74 if (my $len = Devel::Declare::toke_scan_ident( $self->offset )) {
75 my $linestr = $self->get_linestr();
76 my $ident = substr( $linestr, $self->offset, $len );
77 substr( $linestr, $self->offset, $len ) = '';
78 $self->set_linestr($linestr);
79 return $ident;
80 }
81
82 $self->skipspace;
83 return;
84}
85
e7be1784 86sub strip_proto {
5b27c9b2 87 my $self = shift;
88 $self->skipspace;
89
7a3f5539 90 my $linestr = $self->get_linestr();
b0a89632 91 if (substr($linestr, $self->offset, 1) eq '(') {
92 my $length = Devel::Declare::toke_scan_str($self->offset);
7a3f5539 93 my $proto = Devel::Declare::get_lex_stuff();
5b27c9b2 94 Devel::Declare::clear_lex_stuff();
7a3f5539 95 if( $length < 0 ) {
96 # Need to scan ahead more
97 $linestr .= $self->get_linestr();
98 $length = rindex($linestr, ")") - $self->offset + 1;
99 }
100 else {
101 $linestr = $self->get_linestr();
102 }
103
b0a89632 104 substr($linestr, $self->offset, $length) = '';
7a3f5539 105 $self->set_linestr($linestr);
106
5b27c9b2 107 return $proto;
108 }
109 return;
e7be1784 110}
111
112sub get_curstash_name {
5b27c9b2 113 return Devel::Declare::get_curstash_name;
e7be1784 114}
115
116sub shadow {
ab449c2e 117 my $self = shift;
5b27c9b2 118 my $pack = $self->get_curstash_name;
119 Devel::Declare::shadow_sub( $pack . '::' . $self->declarator, $_[0] );
e7be1784 120}
121
122sub inject_if_block {
b0a89632 123 my $self = shift;
5b27c9b2 124 my $inject = shift;
b0a89632 125 my $before = shift || '';
126
5b27c9b2 127 $self->skipspace;
b0a89632 128
7a3f5539 129 my $linestr = $self->get_linestr;
b0a89632 130 if (substr($linestr, $self->offset, 1) eq '{') {
131 substr($linestr, $self->offset + 1, 0) = $inject;
132 substr($linestr, $self->offset, 0) = $before;
7a3f5539 133 $self->set_linestr($linestr);
5b27c9b2 134 }
e7be1784 135}
136
137sub scope_injector_call {
b0a89632 138 my $self = shift;
139 my $inject = shift || '';
140 return ' BEGIN { ' . ref($self) . "->inject_scope('${inject}') }; ";
e7be1784 141}
142
143sub inject_scope {
b0a89632 144 my $class = shift;
145 my $inject = shift;
146 on_scope_end {
5b27c9b2 147 my $linestr = Devel::Declare::get_linestr;
b0a89632 148 return unless defined $linestr;
5b27c9b2 149 my $offset = Devel::Declare::get_linestr_offset;
b0a89632 150 substr( $linestr, $offset, 0 ) = ';' . $inject;
5b27c9b2 151 Devel::Declare::set_linestr($linestr);
b0a89632 152 };
e7be1784 153}
154
1551;
b0a89632 156# vi:sw=2 ts=2