[Dbix-class] Class::C3::Componentised bug (was deployment bug with DBIC running from PAR)

Toby Corkindale toby.corkindale at strategicdata.com.au
Tue Feb 3 23:33:39 GMT 2009


Peter Rabbitson wrote:
> Toby Corkindale wrote:
>> I need to stop replying to myself :(
>> I'd say the problem lies this block of code:
>>
>> # Look through the @INC path to find the file
>>     foreach ( @try_first, @INC ) {
>>         my $full = "$_/$filename";
>>         next unless -e $full;
>>         return $UNIX ? $full : $class->_inc_to_local($full);
>> }
>>
>> since when using PAR, the first entry in @INC is a coderef, and thus
>> this routine tests for '-e "CODE(0xd34db33f)/Foo/Bar.pm"' which, not
>> unsurprisingly, fails.
>>
>> D'Oh.
>>
>> I'll raise some bugs on RT. Not sure where the blame lies now..
> 
> Hi,
> The issue you describe was worked around in this commit.
> http://dev.catalyst.perl.org/svnweb/bast/revision/?rev=5355
> 
> I would recommend against raising a bug against C3:: as it behaves correctly
> wrt availability of a module. Since there is no mechanism for a coderef in
> @INC to say "I didn't find" vs "I didn't load", ensure_class_found can not
> be expected to work correctly. A POD patch indicating the above would be
> most welcome.

I'm not entirely sure what that POD should say though..
"Warning - this feature will not work when used in one of the two ways 
you can use PAR, and thus should not be used at all if you intend your 
application, or any of its descendants, to work properly" ?

Perhaps It would be better to submitt a patch against 
DBIx::Class::Schema::Storage::DBI to remove the uses of 
ensure_class_found instead?

I freely admit I don't understand why one would use the 
"check-but-don't-load" functionality often, especially since the case in 
point that breaks the deployment will always attempt to load the class 
immediately if it is found:

sub load_optional_class {
   my ($class, $f_class) = @_;
   if ($class->ensure_class_found($f_class)) {
     $class->ensure_class_loaded($f_class);
     return 1;
   } else {
     return 0;
   }
}




More information about the DBIx-Class mailing list