branches/context_object: reformatted with 2-space indent, and "if ("
[p5sagit/Devel-Declare.git] / lib / Devel / Declare / Context / Simple.pm
CommitLineData
e7be1784 1package Devel::Declare::Context::Simple;
2
3use Devel::Declare ();
4use Scope::Guard;
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
32sub strip_name {
5b27c9b2 33 my $self = shift;
34 $self->skipspace;
35 if (my $len = Devel::Declare::toke_scan_word( $self->offset, 1 )) {
36 my $linestr = Devel::Declare::get_linestr();
37 my $name = substr( $linestr, $self->offset, $len );
38 substr( $linestr, $self->offset, $len ) = '';
39 Devel::Declare::set_linestr($linestr);
40 return $name;
41 }
42 return;
e7be1784 43}
44
45sub strip_proto {
5b27c9b2 46 my $self = shift;
47 $self->skipspace;
48
49 my $linestr = Devel::Declare::get_linestr();
50 if (substr( $linestr, $self->offset, 1 ) eq '(') {
51 my $length = Devel::Declare::toke_scan_str( $self->offset );
52 my $proto = Devel::Declare::get_lex_stuff();
53 Devel::Declare::clear_lex_stuff();
54 $linestr = Devel::Declare::get_linestr();
55 substr( $linestr, $self->offset, $length ) = '';
56 Devel::Declare::set_linestr($linestr);
57 return $proto;
58 }
59 return;
e7be1784 60}
61
62sub get_curstash_name {
5b27c9b2 63 return Devel::Declare::get_curstash_name;
e7be1784 64}
65
66sub shadow {
5b27c9b2 67 my $self = shift;
68 my $pack = $self->get_curstash_name;
69 Devel::Declare::shadow_sub( $pack . '::' . $self->declarator, $_[0] );
e7be1784 70}
71
72sub inject_if_block {
5b27c9b2 73 my $self = shift;
74 my $inject = shift;
75 $self->skipspace;
76 my $linestr = Devel::Declare::get_linestr;
77 if (substr( $linestr, $self->offset, 1 ) eq '{') {
78 substr( $linestr, $self->offset + 1, 0 ) = $inject;
79 Devel::Declare::set_linestr($linestr);
80 }
e7be1784 81}
82
83sub scope_injector_call {
5b27c9b2 84 return ' BEGIN { ' . __PACKAGE__ . '::inject_scope }; ';
e7be1784 85}
86
87sub inject_scope {
5b27c9b2 88 my $self = shift;
89 $^H |= 0x120000;
90 $^H{DD_METHODHANDLERS} = Scope::Guard->new(sub {
91 my $linestr = Devel::Declare::get_linestr;
92 my $offset = Devel::Declare::get_linestr_offset;
93 substr( $linestr, $offset, 0 ) = ';';
94 Devel::Declare::set_linestr($linestr);
95 });
e7be1784 96}
97
981;
99