Me? I worry about those global variables like
$file,
$html,
%CONFIG and
%REPLACEMENTS and find myself wondering if it wouldn't be better to make them attributes of the parser object:
sub ParserClass::do_global_replace {
my $self = shift;
while (my $token = $self->get_token) {
$self->maybe_do_replacement($token);
}
return $self
}
sub ParserClass::maybe_do_replacement {
my $self = shift;
my $token = shift;
if ($self->stack_matched) {
$self->append_replacement_html;
}
else {
$self->append_html($token);
}
return $self
}
sub ParserClass::append_replacement_html {
my $self = shift;
$self->append_html($self->replacement_html);
$self->increment_replacement_count;
}
(Admittedly, some of the utility functions are left as an exercise to the interested reader, I'm assuming that you have a parser per file and I worry that 'stack_matched' is still a bad name for the function, but I can't think of a better one at present. With these changes in place, your while loop becomes:
$html = $parser->do_global_replace->html;
I still worry mind. Now I'm worried that the parser is doing too much...