1 package Filter::Keyword;
4 use Filter::Keyword::Filter;
5 use Scalar::Util qw(weaken);
6 use Package::Stash::PP;
7 use B qw(svref_2object);
8 use B::Hooks::EndOfScope;
10 sub _compiling_file () {
12 while (my @caller = caller(++$depth)) {
13 if ($caller[3] =~ /::BEGIN$/) {
14 # older perls report the BEGIN in the wrong file
15 return $depth > 1 ? (caller($depth-1))[1] : $caller[1];
27 my $file = _compiling_file;
28 my $filter = $filters{$file} ||= Filter::Keyword::Filter->new;
31 my $parser = $filter->parser;
32 $parser->add_keyword($self);
33 $self->keyword_parser($parser);
42 my $stash = $self->stash;
43 if (my $shadowed = $stash->get_symbol('&'.$self->keyword_name)) {
44 $stash->remove_symbol('&'.$self->keyword_name);
45 $stash->add_symbol('&__'.$self->keyword_name, $shadowed);
51 $self->keyword_parser->remove_keyword($self);
52 $self->clear_keyword_parser;
56 has keyword_parser => (
66 has target_package => (is => 'ro', required => 1);
67 has keyword_name => (is => 'ro', required => 1);
68 has parser => (is => 'ro', required => 1);
70 has stash => (is => 'lazy');
74 Package::Stash::PP->new($self->target_package);
77 has globref => (is => 'lazy', clearer => 'clear_globref');
80 no strict 'refs'; no warnings 'once';
81 \*{join'::',$_[0]->target_package,$_[0]->keyword_name}
84 after clear_globref => sub {
86 $self->stash->remove_symbol('&'.$self->keyword_name);
87 $self->globref_refcount(undef);
90 has globref_refcount => (is => 'rw');
94 $self->globref_refcount(svref_2object($self->globref)->REFCNT);
99 return 0 unless defined($self->globref_refcount);
100 svref_2object($self->globref)->REFCNT > $self->globref_refcount;
103 sub inject_after_scope {
108 $status = filter_read();