X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema%2FLoader.pm;h=ea0fe2cc7689d02f4f144097e512979a0f839a4d;hb=18eb280f9b71785a12c105299f813358faa47143;hp=1c7b649416fba9ab2ea87703a5f1e104d63cd4ee;hpb=a1781f7f4662ebf849773539acbe59eb85a1d0d0;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index 1c7b649..ea0fe2c 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -8,12 +8,13 @@ use mro 'c3'; use Carp::Clan qw/^DBIx::Class/; use Scalar::Util 'weaken'; use Sub::Name 'subname'; +use DBIx::Class::Schema::Loader::Utils 'array_eq'; use namespace::clean; # Always remember to do all digits for the version even if they're 0 # i.e. first release of 0.XX *must* be 0.XX000. This avoids fBSD ports # brain damage and presumably various other packaging systems too -our $VERSION = '0.07010'; +our $VERSION = '0.07018'; __PACKAGE__->mk_group_accessors('inherited', qw/ _loader_args @@ -218,7 +219,8 @@ as soon as the connection information is defined. =cut sub connection { - my $self = shift; + my $self = shift; + my $class = ref $self || $self; if($_[-1] && ref $_[-1] eq 'HASH') { for my $option (qw/loader_class loader_options/) { @@ -233,20 +235,39 @@ sub connection { # before connecting. require DBIx::Class::Schema::Loader::Base; my $temp_loader = DBIx::Class::Schema::Loader::Base->new( - %{ $self->_loader_args } + %{ $self->_loader_args }, + schema => $self, + naming => 'current', + use_namespaces => 1, ); + my $modify_isa = 0; + my @components; + if ($temp_loader->schema_base_class || $temp_loader->schema_components) { - my @components = @{ $temp_loader->schema_components } + @components = @{ $temp_loader->schema_components } if $temp_loader->schema_components; push @components, ('+'.$temp_loader->schema_base_class) if $temp_loader->schema_base_class; - $self->load_components(@components); + my $class_isa = do { + no strict 'refs'; + \@{"${class}::ISA"}; + }; + + my @component_classes = map { + /^\+/ ? substr($_, 1, length($_) - 1) : "DBIx::Class::$_" + } @components; + + $modify_isa++ if not array_eq([ @$class_isa[0..(@components-1)] ], \@component_classes) + } + + if ($modify_isa) { + $class->load_components(@components); # This hack is necessary because we changed @ISA of $self through - # ->load_components. + # ->load_components and we are now in a different place in the mro. no warnings 'redefine'; local *connection = subname __PACKAGE__.'::connection' => sub { @@ -254,13 +275,22 @@ sub connection { $self->next::method(@_); }; - $self = $self->connection(@_); + my @linear_isa = @{ mro::get_linear_isa($class) }; + + my $next_method; + + foreach my $i (1..$#linear_isa) { + no strict 'refs'; + $next_method = *{$linear_isa[$i].'::connection'}{CODE}; + last if $next_method; + } + + $self = $self->$next_method(@_); } else { $self = $self->next::method(@_); } - my $class = ref $self || $self; if(!$class->_loader_invoked) { $self->_invoke_loader } @@ -530,6 +560,8 @@ gugu: Andrey Kostenko jhannah: Jay Hannah +jnap: John Napiorkowski + rbuels: Robert Buels timbunce: Tim Bunce @@ -548,6 +580,8 @@ bphillips: Brian Phillips schwern: Michael G. Schwern +SineSwiper: Brendan Byrd + hobbs: Andrew Rodland domm: Thomas Klausner @@ -556,7 +590,7 @@ spb: Stephen Bennett Matias E. Fernandez -Al Newkirk +alnewkirk: Al Newkirk ... and lots of other folks. If we forgot you, please write the current maintainer or RT. @@ -572,7 +606,8 @@ the same terms as Perl itself. =head1 SEE ALSO -L, L +L, L, L, +L =cut