X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2F_Util.pm;h=73f41e93b8a4b3f6aec8472d4e9619a4e8226321;hb=c5340bfac7aff784999be6ab4fa803fd9440043f;hp=08f3b6901a9df9f0d630de93d2ade8782d4ae215;hpb=a3ae79ed1009ae4679909f4ec7dc0327c1adaae8;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/_Util.pm b/lib/DBIx/Class/_Util.pm index 08f3b69..73f41e9 100644 --- a/lib/DBIx/Class/_Util.pm +++ b/lib/DBIx/Class/_Util.pm @@ -204,7 +204,7 @@ our @EXPORT_OK = qw( scope_guard detected_reinvoked_destructor emit_loud_diag true false is_exception dbic_internal_try dbic_internal_catch visit_namespaces - quote_sub qsub perlstring serialize deep_clone dump_value uniq + quote_sub qsub perlstring serialize deep_clone dump_value uniq bag_eq parent_dir mkdir_p UNRESOLVABLE_CONDITION DUMMY_ALIASPAIR ); @@ -387,6 +387,34 @@ sub uniq { ) } @_; } +sub bag_eq ($$) { + croak "bag_eq() requiress two arrayrefs as arguments" if ( + ref($_[0]) ne 'ARRAY' + or + ref($_[1]) ne 'ARRAY' + ); + + return '' unless @{$_[0]} == @{$_[1]}; + + my( %seen, $numeric_preserving_copy ); + + ( defined $_ + ? $seen{'value' . ( $numeric_preserving_copy = $_ )}++ + : $seen{'undef'}++ + ) for @{$_[0]}; + + ( defined $_ + ? $seen{'value' . ( $numeric_preserving_copy = $_ )}-- + : $seen{'undef'}-- + ) for @{$_[1]}; + + return ( + (grep { $_ } values %seen) + ? '' + : 1 + ); +} + my $dd_obj; sub dump_value ($) { local $Data::Dumper::Indent = 1 @@ -1168,6 +1196,17 @@ sub fail_on_internal_call { $check_fr->[0] =~ /^(?:DBIx::Class|DBICx::)/ and $check_fr->[1] !~ /\b(?:CDBICompat|ResultSetProxy)\b/ # no point touching there + and + # one step higher + @fr2 = CORE::caller(@fr2 ? 3 : 2) + and + # if the frame that called us is an indirect itself - nothing to see here + ! grep + { $_ eq 'DBIC_method_is_indirect_sugar' } + do { + no strict 'refs'; + attributes::get( \&{ $fr2[3] }) + } ) { DBIx::Class::Exception->throw( sprintf ( "Illegal internal call of indirect proxy-method %s() with argument '%s': examine the last lines of the proxy method deparse below to determine what to call directly instead at %s on line %d\n\n%s\n\n Stacktrace starts",