X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCarp.pm;h=6970c103e9be055fbd575a55b44d1ac6f5d4f3dd;hb=43c7e15db1ecb2d5ce1c2c965cee80e5f5b98402;hp=e2af539e5b92895f0e5947bf19374ae5a0bab37b;hpb=70c288086248e5a4008490df22a56632341f2473;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Carp.pm b/lib/DBIx/Class/Carp.pm index e2af539..6970c10 100644 --- a/lib/DBIx/Class/Carp.pm +++ b/lib/DBIx/Class/Carp.pm @@ -3,6 +3,17 @@ package DBIx::Class::Carp; use strict; use warnings; +# This is here instead of DBIx::Class because of load-order issues +BEGIN { + # something is tripping up V::M on 5.8.1, leading to segfaults. + # A similar test in n::c itself is disabled on 5.8.1 for the same + # reason. There isn't much motivation to try to find why it happens + *DBIx::Class::_ENV_::BROKEN_NAMESPACE_CLEAN = ($] < 5.008005) + ? sub () { 1 } + : sub () { 0 } + ; +} + use Carp (); use namespace::clean (); @@ -19,6 +30,14 @@ sub __find_caller { my @f; while (@f = caller($fr_num++)) { last unless $f[0] =~ $skip_pattern; + + if ( + $f[0]->can('_skip_namespace_frames') + and + my $extra_skip = $f[0]->_skip_namespace_frames + ) { + $skip_pattern = qr/$skip_pattern|$extra_skip/; + } } my ($ln, $calling) = @f # if empty - nothing matched - full stack @@ -62,10 +81,10 @@ sub import { ); }; - my $fired; + my $fired = {}; *{"${into}::carp_once"} = sub { - return if $fired; - $fired = 1; + return if $fired->{$_[0]}; + $fired->{$_[0]} = 1; $warn->( __find_caller($skip_pattern, $into), @@ -91,7 +110,11 @@ sub import { }; # cleanup after ourselves - namespace::clean->import(-cleanee => $into, qw/carp carp_once carp_unique/); + namespace::clean->import(-cleanee => $into, qw/carp carp_once carp_unique/) + ## FIXME FIXME FIXME - something is tripping up V::M on 5.8.1, leading + # to segfaults. When n::c/B::H::EndOfScope is rewritten in terms of tie() + # see if this starts working + unless DBIx::Class::_ENV_::BROKEN_NAMESPACE_CLEAN; } sub unimport { @@ -118,7 +141,8 @@ In addition to the classic interface: this module also supports a class-data based way to specify the exclusion regex. A message is only carped from a callsite that matches neither the closed over string, nor the value of L as declared -on the B callframe origin. +on any callframe already skipped due to the same mechanism. This is to ensure +that intermediate callsites can declare their own additional skip-namespaces. =head1 CLASS ATTRIBUTES