=head1 VERSION
-Version 0.04
+Version 0.05
=cut
-our $VERSION = '0.04';
+our $VERSION = '0.05';
=head1 DESCRIPTION
$file =~ s/(?<!\\)((\\\\)*)"/$1\\"/g;
my @errs;
+ my $hook = sub { push @errs, [ @_ ] };
+
my $wrapper = <<" WRAPPER";
- {
return;
package main;
- no indirect hook => sub { push \@errs, [ \@_ ] };
- {
- ;
+ no strict;
+ no warnings;
+ no indirect hook => \$hook;
+ do {
#line 1 "$file"
$src
}
- }
WRAPPER
{
local ($@, *_);
eval $wrapper; ## no critic
- if ($@) {
+ if (my $err = $@) {
require Carp;
- Carp::confess("Couldn't compile the source wrapper: $@");
+ Carp::croak("Couldn't compile the source wrapper: $err");
}
}
=head1 CAVEATS
-The uses of the L<indirect> pragma inside the auditted code take precedence over this policy.
+The uses of the L<indirect> pragma inside the audited code take precedence over this policy.
Hence no violations will be reported for indirect method calls that are located inside the lexical scope of C<use indirect> or C<< no indirect hook => ... >>.
Occurrences of C<no indirect> won't be a problem.
L<Perl::Critic>, L<Perl::Critic::Dynamic>.
-L<indirect>.
+L<indirect> 0.20.
+
+=head1 SEE ALSO
+
+L<Perl::Critic::Policy::Objects::ProhibitIndirectSyntax> is a L<Perl::Critic> policy that statically checks for indirect constructs.
+But to be static it has to be very restricted : you have to manually specify which subroutine names are methods for which the indirect form should be forbidden.
+This can lead to false positives (a subroutine with the name you gave is defined in the current scope) and negatives (indirect constructs for methods you didn't specify).
+But you don't need to actually compile (or run, as it's more or less the same thing) the code.
=head1 AUTHOR
=head1 COPYRIGHT & LICENSE
-Copyright 2009 Vincent Pit, all rights reserved.
+Copyright 2009,2010 Vincent Pit, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.