Commit | Line | Data |
e7be1784 |
1 | package Devel::Declare::Context::Simple; |
2 | |
3 | use Devel::Declare (); |
b0a89632 |
4 | use B::Hooks::EndOfScope; |
e7be1784 |
5 | use strict; |
6 | use warnings; |
7 | |
8 | sub new { |
5b27c9b2 |
9 | my $class = shift; |
10 | bless {@_}, $class; |
e7be1784 |
11 | } |
12 | |
13 | sub init { |
5b27c9b2 |
14 | my $self = shift; |
15 | @{$self}{ qw(Declarator Offset) } = @_; |
ab449c2e |
16 | return $self; |
e7be1784 |
17 | } |
18 | |
ab449c2e |
19 | sub offset { |
20 | my $self = shift; |
21 | return $self->{Offset} |
22 | } |
23 | |
24 | sub inc_offset { |
25 | my $self = shift; |
26 | $self->{Offset} += shift; |
27 | } |
28 | |
29 | sub declarator { |
30 | my $self = shift; |
31 | return $self->{Declarator} |
32 | } |
e7be1784 |
33 | |
34 | sub skip_declarator { |
5b27c9b2 |
35 | my $self = shift; |
ab449c2e |
36 | $self->inc_offset(Devel::Declare::toke_move_past_token($self->offset)); |
e7be1784 |
37 | } |
38 | |
39 | sub skipspace { |
5b27c9b2 |
40 | my $self = shift; |
ab449c2e |
41 | $self->inc_offset(Devel::Declare::toke_skipspace($self->offset)); |
e7be1784 |
42 | } |
43 | |
7a3f5539 |
44 | sub get_linestr { |
45 | my $self = shift; |
46 | my $line = Devel::Declare::get_linestr(); |
47 | return $line; |
48 | } |
49 | |
50 | sub set_linestr { |
51 | my $self = shift; |
52 | my ($line) = @_; |
53 | Devel::Declare::set_linestr($line); |
54 | } |
55 | |
e7be1784 |
56 | sub 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 | |
71 | sub 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 | |
97 | sub get_curstash_name { |
5b27c9b2 |
98 | return Devel::Declare::get_curstash_name; |
e7be1784 |
99 | } |
100 | |
101 | sub 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 | |
107 | sub 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 | |
122 | sub scope_injector_call { |
b0a89632 |
123 | my $self = shift; |
124 | my $inject = shift || ''; |
125 | return ' BEGIN { ' . ref($self) . "->inject_scope('${inject}') }; "; |
e7be1784 |
126 | } |
127 | |
128 | sub 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 | |
140 | 1; |
b0a89632 |
141 | # vi:sw=2 ts=2 |