[Dbix-class] Patch for inject_base
    Vsevolod (Simon) Ilyushchenko 
    simonf at cshl.edu
       
    Tue Dec  6 02:10:12 CET 2005
    
    
  
Matt,
Here you go. A test case and a better patch (checks for both direct and 
indirect parent, not just direct ones).
Simon
Matt S Trout wrote on 12/02/2005 09:41 PM:
> On Wed, Nov 30, 2005 at 07:24:29PM -0500, Vsevolod (Simon) Ilyushchenko wrote:
> 
>>Matt,
>>
>>I've found that when for some reason the same class is passed twice to 
>>the hierarchy, Class::C3 complains. To fix this, I suggest the following 
>>patch:
>>
>>--- lib/DBIx/Class/Componentised.pm     2005-11-26 18:26:14.000000000 -0500
>>+++ /opt/software/perl/lib/DBIx/Class/Componentised.pm  2005-11-30 
>>18:46:11.000000000 -0500
>>@@ -6,7 +6,8 @@
>>   my ($class, $target, @to_inject) = @_;
>>   {
>>     no strict 'refs';
>>-    unshift(@{"${target}::ISA"}, grep { $target ne $_ } @to_inject);
>>+    my %isa = map {$_=>1} @{"${target}::ISA"};
>>+    unshift(@{"${target}::ISA"}, grep { $target ne $_ && !$isa{$_}} 
>>@to_inject);
>>   }
>>   my $table = { Class::C3::_dump_MRO_table };
>>   eval "package $target; import Class::C3;" unless exists 
>>$table->{$target};
> 
> 
> I'd be happy to commit this, but is there any chance of a test case as well,
> please?
> 
-- 
Simon (Vsevolod ILyushchenko)   simonf at cshl.edu
				http://www.simonf.com
"Think like a man of action, act like a man of thought."
		         Henri Bergson
-------------- next part --------------
--- Componentised.pm	2005-11-26 18:26:14.000000000 -0500
+++ /opt/software/perl/lib/DBIx/Class/Componentised.pm	2005-12-05 19:56:32.000000000 -0500
@@ -6,7 +6,7 @@
   my ($class, $target, @to_inject) = @_;
   {
     no strict 'refs';
-    unshift(@{"${target}::ISA"}, grep { $target ne $_ } @to_inject);
+    unshift(@{"${target}::ISA"}, grep { $target ne $_ && !$target->isa($_)} @to_inject);
   }
   my $table = { Class::C3::_dump_MRO_table };
   eval "package $target; import Class::C3;" unless exists $table->{$target};
-------------- next part --------------
#!/usr/bin/perl -w
#Simon Ilyushchenko, 12/05/05
#Testing the case when we try to inject into @ISA a class that's already a parent of the target class.
use strict;
use Test::More tests => 2;
{
package AAA;
use base "DBIx::Class::Core";
package BBB;
use base 'AAA';
#Injecting a direct parent.
__PACKAGE__->inject_base( __PACKAGE__, 'AAA' );
package CCC;
use base 'AAA';
#Injecting an indirect parent.
__PACKAGE__->inject_base( __PACKAGE__, 'DBIx::Class::Core' );
}
eval { Class::C3::calculateMRO('BBB'); };
ok (! $@, "Correctly skipped injecting a direct parent of class BBB");
eval { Class::C3::calculateMRO('CCC'); };
ok (! $@, "Correctly skipped injecting an indirect parent of class BBB");
    
    
More information about the Dbix-class
mailing list