From: Peter Rabbitson Date: Sat, 27 Oct 2012 16:30:35 +0000 (+0200) Subject: Switch all module loading to Module::Runtime X-Git-Tag: v0.10007~18 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6d0e8ff22ed40635a7fdee49ce79175e7ae3e385;p=p5sagit%2FClass-Accessor-Grouped.git Switch all module loading to Module::Runtime lose dependency on Class::Inspector --- diff --git a/Changes b/Changes index bcc1092..ee5603a 100644 --- a/Changes +++ b/Changes @@ -3,6 +3,8 @@ Revision history for Class::Accessor::Grouped. - Disable tests on perls where Class::XSAccessor emits broken error messages (RT#74883, RT#80519) - Drop minimum perl to 5.6 (from 5.6.2) + - Switch all module loading to Module::Runtime and lose + dependency on Class::Inspector 0.10006 2011-12-30 03:52 (UTC) - Silence warnings resulting from incomplete can() overrides diff --git a/Makefile.PL b/Makefile.PL index 137349b..c6ee9cc 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -8,16 +8,16 @@ perl_version '5.006'; all_from 'lib/Class/Accessor/Grouped.pm'; requires 'Carp'; +requires 'Module::Runtime' => '0.012'; requires 'Scalar::Util'; requires 'MRO::Compat' if $] < 5.009_005; -requires 'Class::Inspector'; if (can_cc or $Module::Install::AUTHOR) { requires 'Sub::Name' => '0.05'; # when changing don't forget to adjust lib/Class/Accessor/Grouped.pm as well requires 'Class::XSAccessor' => '1.13' - if $] > '5.008'; + if $] > '5.008'; # CXSA does not work on 5.6 } test_requires 'Test::More' => '0.94'; diff --git a/lib/Class/Accessor/Grouped.pm b/lib/Class/Accessor/Grouped.pm index 6fdd4ab..c568f6b 100644 --- a/lib/Class/Accessor/Grouped.pm +++ b/lib/Class/Accessor/Grouped.pm @@ -3,10 +3,12 @@ use strict; use warnings; use Carp (); use Scalar::Util (); +use Module::Runtime (); BEGIN { + # use M::R to work around the 5.8 require bugs if ($] < 5.009_005) { - require MRO::Compat; + Module::Runtime::require_module('MRO::Compat'); } else { require mro; @@ -26,6 +28,36 @@ our $USE_XS; $USE_XS = $ENV{CAG_USE_XS} unless defined $USE_XS; +BEGIN { + package __CAG_ENV__; + + die "Huh?! No minimum C::XSA version?!\n" + unless $__minimum_xsa_version; + + local $@; + require constant; + + # individual (one const at a time) imports so we are 5.6.2 compatible + # if we can - why not ;) + constant->import( NO_SUBNAME => eval { + Module::Runtime::require_module('Sub::Name') + } ? 0 : "$@" ); + + constant->import( NO_CXSA => ( !NO_SUBNAME() and eval { + Module::Runtime::use_module('Class::XSAccessor' => $__minimum_xsa_version) + } ) ? 0 : "$@" ); + + constant->import( BROKEN_GOTO => ($] < '5.008009') ? 1 : 0 ); + + constant->import( UNSTABLE_DOLLARAT => ($] < '5.013002') ? 1 : 0 ); + + constant->import( TRACK_UNDEFER_FAIL => ( + $INC{'Test/Builder.pm'} || $INC{'Test/Builder2.pm'} + and + $0 =~ m|^ x?t / .+ \.t $|x + ) ? 1 : 0 ); +} + # Yes this method is undocumented # Yes it should be a private coderef like all the rest at the end of this file # No we can't do that (yet) because the DBIC-CDBI compat layer overrides it @@ -342,14 +374,25 @@ it. This method will die if the specified class could not be loaded. =cut sub set_component_class { - if ($_[2]) { - local $^W = 0; - require Class::Inspector; - if (Class::Inspector->installed($_[2]) && !Class::Inspector->loaded($_[2])) { - eval "require $_[2]"; + if (defined $_[2] and length $_[2]) { + # disable warnings, and prevent $_ being eaten away by a behind-the-scenes + # module loading + local ($^W, $_); - Carp::croak("Could not load $_[1] '$_[2]': ", $@) if $@; - }; + if (__CAG_ENV__::UNSTABLE_DOLLARAT) { + my $err; + { + local $@; + eval { Module::Runtime::use_package_optimistically($_[2]) } + or $err = $@; + } + Carp::croak("Could not load $_[1] '$_[2]': $err") if defined $err; + + } + else { + eval { Module::Runtime::use_package_optimistically($_[2]) } + or Carp::croak("Could not load $_[1] '$_[2]': $@"); + } }; return $_[0]->set_inherited($_[1], $_[2]); @@ -522,62 +565,6 @@ it under the same terms as perl itself. ######################################################################## ######################################################################## -BEGIN { - - die "Huh?! No minimum C::XSA version?!\n" - unless $__minimum_xsa_version; - - local $@; - my $err; - - - $err = eval { require Sub::Name; 1; } ? undef : do { - delete $INC{'Sub/Name.pm'}; # because older perls suck - $@; - }; - *__CAG_ENV__::NO_SUBNAME = $err - ? sub () { $err } - : sub () { 0 } - ; - - - $err = eval { - require Class::XSAccessor; - Class::XSAccessor->VERSION($__minimum_xsa_version); - require Sub::Name; - 1; - } ? undef : do { - delete $INC{'Sub/Name.pm'}; # because older perls suck - delete $INC{'Class/XSAccessor.pm'}; - $@; - }; - *__CAG_ENV__::NO_CXSA = $err - ? sub () { $err } - : sub () { 0 } - ; - - - *__CAG_ENV__::BROKEN_GOTO = ($] < '5.008009') - ? sub () { 1 } - : sub () { 0 } - ; - - - *__CAG_ENV__::UNSTABLE_DOLLARAT = ($] < '5.013002') - ? sub () { 1 } - : sub () { 0 } - ; - - - *__CAG_ENV__::TRACK_UNDEFER_FAIL = ( - $INC{'Test/Builder.pm'} || $INC{'Test/Builder2.pm'} - and - $0 =~ m|^ x?t / .+ \.t $|x - ) ? sub () { 1 } - : sub () { 0 } - ; -} - # Autodetect unless flag supplied my $xsa_autodetected; if (! defined $USE_XS) { diff --git a/t/component.t b/t/component.t index a86b515..285ba04 100644 --- a/t/component.t +++ b/t/component.t @@ -3,7 +3,6 @@ use Test::Exception; use strict; use warnings; use lib 't/lib'; -use Class::Inspector; use AccessorGroupsComp; is(AccessorGroupsComp->result_class, undef); @@ -21,9 +20,9 @@ is($dying->result_class, undef); $dying->result_class('JunkiesNeverInstalled'); is($dying->result_class, 'JunkiesNeverInstalled'); -ok(!Class::Inspector->loaded('BaseInheritedGroups')); +ok(! $INC{'BaseInheritedGroups.pm'}); AccessorGroupsComp->result_class('BaseInheritedGroups'); -ok(Class::Inspector->loaded('BaseInheritedGroups')); +ok($INC{'BaseInheritedGroups.pm'}); is(AccessorGroupsComp->result_class, 'BaseInheritedGroups'); ## unset it