#
'Sub::Uplevel' => '0.19',
- # this is already a dep of n::c, but just in case - used by t/55namespaces_cleaned.t
- # remove and do a manual glob-collection if n::c is no longer a dep
- 'Package::Stash' => '0.28',
-
# needed for testing only, not for operation
# we will move away from this dep eventually, perhaps to DBD::CSV or something
%{ DBIx::Class::Optional::Dependencies->req_list_for('test_rdbms_sqlite') },
use strict;
use warnings;
use base 'DBIx::Class';
-use Package::Stash ();
-use DBIx::Class::_Util 'set_subname';
+use DBIx::Class::_Util qw( set_subname describe_class_methods );
use namespace::clean;
warn "DBIx::Class::ResultSetManager never left experimental status and
my $cache = $self->_attr_cache;
return if keys %$cache == 0;
- foreach my $meth (keys %{ { map
- { $_ => 1 }
+ for my $meth(
map
- { Package::Stash->new($_)->list_all_symbols("CODE") }
- @{ mro::get_linear_isa( ref $self || $self ) }
- } } ) {
- # *DO NOT* rely on P::S returning crefs in reverse mro order
- # but instead ask the mro to redo the lookup
+ { $_->{name} }
+ grep
+ { $_->{attributes}{ResultSet} }
+ map
+ { $_->[0] }
+ values %{ describe_class_methods( ref $self || $self )->{methods} }
+ ) {
# This codepath is extremely old, miht as well keep it running
# as-is with no room for surprises
- my $attrs = $cache->{$self->can($meth)};
- next unless $attrs;
- if ($attrs->[0] eq 'ResultSet') {
- no strict 'refs';
- my $resultset_class = $self->_setup_resultset_class;
- my $name = join '::',$resultset_class, $meth;
- *$name = set_subname $name, $self->can($meth);
- delete ${"${self}::"}{$meth};
- }
+ no strict 'refs';
+ my $resultset_class = $self->_setup_resultset_class;
+ my $name = join '::',$resultset_class, $meth;
+ *$name = set_subname $name, $self->can($meth);
+ delete ${"${self}::"}{$meth};
}
}
use strict;
use warnings;
-# FIXME This is a crock of shit, needs to go away
-# currently here to work around https://rt.cpan.org/Ticket/Display.html?id=74151
-# kill with fire when PS::XS / RT#74151 is *finally* fixed
-BEGIN {
- my $PS_provider;
-
- if ( "$]" < 5.010 ) {
- require Package::Stash::PP;
- $PS_provider = 'Package::Stash::PP';
- }
- else {
- require Package::Stash;
- $PS_provider = 'Package::Stash';
- }
- eval <<"EOS" or die $@;
-
-sub stash_for (\$) {
- $PS_provider->new(\$_[0]);
-}
-1;
-EOS
-}
-
use Test::More;
use DBICTest;
use File::Find;
use File::Spec;
-use DBIx::Class::_Util 'get_subname';
+use DBIx::Class::_Util qw( get_subname describe_class_methods );
# makes sure we can load at least something
use DBIx::Class;
use DBIx::Class::Carp;
-my @modules = grep {
+my @modules = map {
+ # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME
+ # FIXME !!! without this detaint I get the test into an infloop on 5.16.x
+ # (maybe other versions): https://travis-ci.org/ribasushi/dbix-class/jobs/144738784#L26762
+ #
+ # or locally like:
+ #
+ # ~$ ulimit -v $(( 1024 * 256 )); perl -d:Confess -Ilib -Tl xt/extra/internals/namespaces_cleaned.t
+ # ...
+ # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166
+ # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166
+ # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 166
+ # DBIx::Class::MethodAttributes::_attr_cache("DBIx::Class::Storage::DBI::ODBC::Firebird") called at lib/DBIx/Class/MethodAttributes.pm line 154
+ # DBIx::Class::MethodAttributes::FETCH_CODE_ATTRIBUTES("DBIx::Class::Storage::DBI::ODBC::Firebird", CODE(0x42ac2b0)) called at /home/rabbit/perl5/perlbrew/perls/5.16.2/lib/5.16.2/x86_64-linux-thread-multi-ld/attributes.pm line 101
+ # attributes::get(CODE(0x42ac2b0)) called at lib/DBIx/Class/_Util.pm line 885
+ # eval {...} called at lib/DBIx/Class/_Util.pm line 885
+ # DBIx::Class::_Util::describe_class_methods("DBIx::Class::Storage::DBI::ODBC::Firebird") called at xt/extra/internals/namespaces_cleaned.t line 129
+ # Out of memory!
+ # Out of memory!
+ # Out of memory!
+ # ...
+ # Segmentation fault
+ #
+ # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME
+ # Sweeping it under the rug for now as this is an xt/ test,
+ # but someone *must* find what is going on eventually
+ # FIXME: AS THIS IS CLEARLY A LACK OF DEFENSE IN describe_class_methods :FIXME
+
+ ( $_ =~ /(.+)/ )
+
+} grep {
my ($mod) = $_ =~ /(.+)/;
# not all modules are loadable at all times
SKIP: {
skip "$mod exempt from namespace checks",1 if $skip_idx->{$mod};
- my %all_method_like = (map
- { %{stash_for($_)->get_all_symbols('CODE')} }
- (reverse @{mro::get_linear_isa($mod)})
- );
+ my %all_method_like =
+ map
+ { $_->[0]{name} => $mod->can( $_->[0]{name} ) }
+ grep
+ { $_->[0]{via_class} ne 'UNIVERSAL' }
+ values %{ describe_class_methods($mod)->{methods} }
+ ;
my %parents = map { $_ => 1 } @{mro::get_linear_isa($mod)};