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