X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FCarp.pm;h=443e6ca3894dc1905727b661753b1d9914514531;hb=5f7ff3f01b9b1b34137d99ed2e9e4d8247d5bcd4;hp=62170ff821675c578fd5c40cb2ac3bc92899b892;hpb=90cfe42b94a798be8ee5498fd57e2e76adff5156;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Carp.pm b/lib/DBIx/Class/Carp.pm index 62170ff..443e6ca 100644 --- a/lib/DBIx/Class/Carp.pm +++ b/lib/DBIx/Class/Carp.pm @@ -1,8 +1,20 @@ -package DBIx::Class::Carp; +package # hide from pause + 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 +31,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 @@ -44,13 +64,6 @@ my $warn = sub { ); }; -# FIXME - see below -BEGIN { - *__BROKEN_NC = ($] < 5.008003) - ? sub () { 1 } - : sub () { 0 } - ; -} sub import { my (undef, $skip_pattern) = @_; my $into = caller; @@ -69,10 +82,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), @@ -102,7 +115,7 @@ sub import { ## 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 __BROKEN_NC(); + unless DBIx::Class::_ENV_::BROKEN_NAMESPACE_CLEAN; } sub unimport { @@ -129,7 +142,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