only use one filter for multiple keywords
[p5sagit/Filter-Keyword.git] / lib / Filter / Keyword / Filter.pm
1 package Filter::Keyword::Filter;
2 use Moo;
3
4 use Filter::Keyword::Parser;
5 use Filter::Util::Call;
6 use Scalar::Util qw(weaken);
7 use B::Hooks::EndOfScope;
8
9 has parser => (is => 'lazy');
10 has active => (is => 'rwp', default => 0);
11
12 sub _build_parser {
13   my $self = shift;
14   weaken $self;
15   Filter::Keyword::Parser->new(
16     reader => sub { my $r = filter_read; ($_, $r) },
17     re_add => sub { filter_add($self) },
18   );
19 }
20
21 sub install {
22   my ($self) = @_;
23   return if $self->active;
24   $self->_set_active(1);
25   filter_add($self);
26   on_scope_end {
27     $self->_set_active(0);
28     filter_del;
29   };
30   $self;
31 }
32
33 sub filter {
34   my ($self) = @_;
35   my ($string, $code) = $self->parser->get_next;
36   $_ = $string;
37   return $code;
38 }
39
40 1;
41