Version 0.003000.
[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) } = @_;
16 $self;
e7be1784 17}
18
19sub offset : lvalue { shift->{Offset}; }
20sub declarator { shift->{Declarator} }
21
22sub skip_declarator {
5b27c9b2 23 my $self = shift;
24 $self->offset += Devel::Declare::toke_move_past_token( $self->offset );
e7be1784 25}
26
27sub skipspace {
5b27c9b2 28 my $self = shift;
29 $self->offset += Devel::Declare::toke_skipspace( $self->offset );
e7be1784 30}
31
7a3f5539 32sub get_linestr {
33 my $self = shift;
34 my $line = Devel::Declare::get_linestr();
35 return $line;
36}
37
38sub set_linestr {
39 my $self = shift;
40 my ($line) = @_;
41 Devel::Declare::set_linestr($line);
42}
43
e7be1784 44sub strip_name {
5b27c9b2 45 my $self = shift;
46 $self->skipspace;
47 if (my $len = Devel::Declare::toke_scan_word( $self->offset, 1 )) {
7a3f5539 48 my $linestr = $self->get_linestr();
5b27c9b2 49 my $name = substr( $linestr, $self->offset, $len );
50 substr( $linestr, $self->offset, $len ) = '';
7a3f5539 51 $self->set_linestr($linestr);
5b27c9b2 52 return $name;
53 }
b0a89632 54
55 $self->skipspace;
5b27c9b2 56 return;
e7be1784 57}
58
59sub strip_proto {
5b27c9b2 60 my $self = shift;
61 $self->skipspace;
62
7a3f5539 63 my $linestr = $self->get_linestr();
b0a89632 64 if (substr($linestr, $self->offset, 1) eq '(') {
65 my $length = Devel::Declare::toke_scan_str($self->offset);
7a3f5539 66 my $proto = Devel::Declare::get_lex_stuff();
5b27c9b2 67 Devel::Declare::clear_lex_stuff();
7a3f5539 68 if( $length < 0 ) {
69 # Need to scan ahead more
70 $linestr .= $self->get_linestr();
71 $length = rindex($linestr, ")") - $self->offset + 1;
72 }
73 else {
74 $linestr = $self->get_linestr();
75 }
76
b0a89632 77 substr($linestr, $self->offset, $length) = '';
7a3f5539 78 $self->set_linestr($linestr);
79
5b27c9b2 80 return $proto;
81 }
82 return;
e7be1784 83}
84
85sub get_curstash_name {
5b27c9b2 86 return Devel::Declare::get_curstash_name;
e7be1784 87}
88
89sub shadow {
5b27c9b2 90 my $self = shift;
91 my $pack = $self->get_curstash_name;
92 Devel::Declare::shadow_sub( $pack . '::' . $self->declarator, $_[0] );
e7be1784 93}
94
95sub inject_if_block {
b0a89632 96 my $self = shift;
5b27c9b2 97 my $inject = shift;
b0a89632 98 my $before = shift || '';
99
5b27c9b2 100 $self->skipspace;
b0a89632 101
7a3f5539 102 my $linestr = $self->get_linestr;
b0a89632 103 if (substr($linestr, $self->offset, 1) eq '{') {
104 substr($linestr, $self->offset + 1, 0) = $inject;
105 substr($linestr, $self->offset, 0) = $before;
7a3f5539 106 $self->set_linestr($linestr);
5b27c9b2 107 }
e7be1784 108}
109
110sub scope_injector_call {
b0a89632 111 my $self = shift;
112 my $inject = shift || '';
113 return ' BEGIN { ' . ref($self) . "->inject_scope('${inject}') }; ";
e7be1784 114}
115
116sub inject_scope {
b0a89632 117 my $class = shift;
118 my $inject = shift;
119 on_scope_end {
5b27c9b2 120 my $linestr = Devel::Declare::get_linestr;
b0a89632 121 return unless defined $linestr;
5b27c9b2 122 my $offset = Devel::Declare::get_linestr_offset;
b0a89632 123 substr( $linestr, $offset, 0 ) = ';' . $inject;
5b27c9b2 124 Devel::Declare::set_linestr($linestr);
b0a89632 125 };
e7be1784 126}
127
1281;
b0a89632 129# vi:sw=2 ts=2