};
}
-has _shadowed_sub => (is => 'rw', clearer => '_clear_shadowed_sub');
+has _shadowed_sub => (is => 'rw', clearer => 1);
sub shadow_sub {
my $self = shift;
if (my $shadowed = $stash->get_symbol('&'.$self->keyword_name)) {
$self->_shadowed_sub($shadowed);
$stash->remove_symbol('&'.$self->keyword_name);
- $stash->add_symbol('&__'.$self->keyword_name, $shadowed);
}
}
my $stash = $self->stash;
if (my $shadowed = $self->_shadowed_sub) {
$self->_clear_shadowed_sub;
- $stash->remove_symbol('&__'.$self->keyword_name);
$stash->add_symbol('&'.$self->keyword_name, $shadowed);
}
}
has keyword_name => (is => 'ro', required => 1);
has parser => (is => 'ro', required => 1);
+sub parse {
+ my $self = shift;
+ $self->${\$self->parser}(@_);
+}
+
has stash => (is => 'lazy');
sub _build_stash {
after clear_globref => sub {
my ($self) = @_;
$self->stash->remove_symbol('&'.$self->keyword_name);
+ if (my $shadowed = $self->_shadowed_sub) {
+ { no warnings 'redefine', 'prototype'; *{$self->globref} = $shadowed; }
+ }
$self->globref_refcount(undef);
};
has code => (is => 'rw', default => sub { '' });
+has active_keyword => (is => 'rw', clearer => 1);
+
sub get_next {
my ($self) = @_;
if ($self->short_circuit) {
$self->${\$self->re_add};
return ('', 0);
}
+ if (my $keyword = $self->active_keyword) {
+ $self->clear_active_keyword;
+ $keyword->clear_globref;
+ return $keyword->parse($self);
+ }
for my $keyword (@{$self->keywords}) {
if ($keyword->have_match) {
- $keyword->clear_globref;
- return $keyword->parser->($keyword, $self);
+ $self->active_keyword($keyword);
+ $self->short_circuit(1);
+ my $match = $self->current_match->[0];
+ my $end = $match eq '{' ? '}'
+ : $match eq '(' ? ')'
+ : '';
+ return ("$end;", 1);
}
}
return $self->check_match;