X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2Findirect.git;a=blobdiff_plain;f=lib%2Findirect.pm;h=76a3ee0a47ee78ec03dcb963259608557cd47cc7;hp=1c4d065d542d968c0f98ac42a7b365ee67cb9132;hb=eb25d798995d30e0d78d38dd746c28961ec3d71d;hpb=5da717399870f32544637bd4068e00e01eab84a2 diff --git a/lib/indirect.pm b/lib/indirect.pm index 1c4d065..76a3ee0 100644 --- a/lib/indirect.pm +++ b/lib/indirect.pm @@ -11,13 +11,13 @@ indirect - Lexically warn about using the indirect method call syntax. =head1 VERSION -Version 0.25 +Version 0.26 =cut our $VERSION; BEGIN { - $VERSION = '0.25'; + $VERSION = '0.26'; } =head1 SYNOPSIS @@ -78,7 +78,14 @@ BEGIN { =head1 METHODS -=head2 C<< unimport [ 'global', hook => $hook | 'fatal' ] >> +=head2 C + + no indirect; + no indirect 'fatal'; + no indirect hook => sub { my ($obj, $name, $file, $line) = @_; ... }; + no indirect 'global'; + no indirect 'global, 'fatal'; + no indirect 'global', hook => sub { ... }; Magically called when C is encountered. Turns the module on. @@ -90,11 +97,15 @@ The policy to apply depends on what is first found in C<@opts> : If it is a string that matches C, the compilation will croak when the first indirect method call is found. +This option is mutually exclusive with the C<'hook'> option. + =item * If the key/value pair C<< hook => $hook >> comes first, C<$hook> will be called for each error with a string representation of the object as C<$_[0]>, the method name as C<$_[1]>, the current file as C<$_[2]> and the line number as C<$_[3]>. If and only if the object is actually a block, C<$_[0]> is assured to start by C<'{'>. +This option is mutually exclusive with the C<'fatal'> option. + =item * If none of C and C are specified, a warning will be emitted for each indirect method call. @@ -124,24 +135,32 @@ Note that if another policy is installed by a C statement further i =cut +sub _no_hook_and_fatal { + require Carp; + Carp::croak("The 'fatal' and 'hook' options are mutually exclusive"); +} + sub unimport { shift; - my $hook; - my $global; + my ($global, $fatal, $hook); + while (@_) { my $arg = shift; if ($arg eq 'hook') { - last if $hook; + _no_hook_and_fatal() if $fatal; $hook = shift; } elsif ($arg =~ /^:?fatal$/i) { - last if $hook; - $hook = sub { die msg(@_) }; + _no_hook_and_fatal() if defined $hook; + $fatal = 1; } elsif ($arg =~ /^:?global$/i) { $global = 1; } } - $hook = sub { warn msg(@_) } unless defined $hook; + + unless (defined $hook) { + $hook = $fatal ? sub { die msg(@_) } : sub { warn msg(@_) }; + } $^H |= 0x00020000; if ($global) { @@ -156,6 +175,8 @@ sub unimport { =head2 C + use indirect; + Magically called at each C. Turns the module off. As explained in L's description, an C statement will lexically override a global policy previously installed by C (if there's one). @@ -171,7 +192,9 @@ sub import { =head1 FUNCTIONS -=head2 C +=head2 C + + my $msg = msg($object, $method, $file, $line); Returns the default error message that C generates when an indirect method call is reported. @@ -237,7 +260,7 @@ L 5.8.1. A C compiler. This module may happen to build with a C++ compiler as well, but don't rely on it, as no guarantee is made in this regard. -L (standard since perl 5.006). +L (standard since perl 5), L (since perl 5.006). =head1 AUTHOR @@ -266,7 +289,7 @@ Andrew Main and Florian Ragwitz, for testing on real-life code and reporting iss =head1 COPYRIGHT & LICENSE -Copyright 2008,2009,2010,2011 Vincent Pit, all rights reserved. +Copyright 2008,2009,2010,2011,2012,2013 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.