Version 0.005000.
[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();
86964fb3 95 $linestr = $self->get_linestr();
7a3f5539 96
b0a89632 97 substr($linestr, $self->offset, $length) = '';
7a3f5539 98 $self->set_linestr($linestr);
99
5b27c9b2 100 return $proto;
101 }
102 return;
e7be1784 103}
104
105sub get_curstash_name {
5b27c9b2 106 return Devel::Declare::get_curstash_name;
e7be1784 107}
108
109sub shadow {
ab449c2e 110 my $self = shift;
5b27c9b2 111 my $pack = $self->get_curstash_name;
112 Devel::Declare::shadow_sub( $pack . '::' . $self->declarator, $_[0] );
e7be1784 113}
114
115sub inject_if_block {
b0a89632 116 my $self = shift;
5b27c9b2 117 my $inject = shift;
b0a89632 118 my $before = shift || '';
119
5b27c9b2 120 $self->skipspace;
b0a89632 121
7a3f5539 122 my $linestr = $self->get_linestr;
b0a89632 123 if (substr($linestr, $self->offset, 1) eq '{') {
124 substr($linestr, $self->offset + 1, 0) = $inject;
125 substr($linestr, $self->offset, 0) = $before;
7a3f5539 126 $self->set_linestr($linestr);
712c5dd1 127 return 1;
5b27c9b2 128 }
712c5dd1 129 return 0;
e7be1784 130}
131
132sub scope_injector_call {
b0a89632 133 my $self = shift;
134 my $inject = shift || '';
135 return ' BEGIN { ' . ref($self) . "->inject_scope('${inject}') }; ";
e7be1784 136}
137
138sub inject_scope {
b0a89632 139 my $class = shift;
140 my $inject = shift;
141 on_scope_end {
5b27c9b2 142 my $linestr = Devel::Declare::get_linestr;
b0a89632 143 return unless defined $linestr;
5b27c9b2 144 my $offset = Devel::Declare::get_linestr_offset;
b0a89632 145 substr( $linestr, $offset, 0 ) = ';' . $inject;
5b27c9b2 146 Devel::Declare::set_linestr($linestr);
b0a89632 147 };
e7be1784 148}
149
1501;
b0a89632 151# vi:sw=2 ts=2