From: Luke Saunders Date: Thu, 7 Aug 2008 00:07:20 +0000 (+0000) Subject: refactored compose_namepspace X-Git-Tag: v0.08240~384 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=6eec9003c0b7825a896bec4e87b4139443b8bf88;p=dbsrgits%2FDBIx-Class.git refactored compose_namepspace --- diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 94bc72d..5576378 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -131,12 +131,12 @@ sub _register_source { $self->source_registrations(\%reg); $source->schema($self); - weaken($source->{schema}) if ref($self); + return if ($params->{extra}); + if ($source->result_class) { my %map = %{$self->class_mappings}; if (exists $map{$source->result_class}) { - return if ($params->{extra}); warn $source->result_class . ' already has a source, use register_extra_source for additional sources'; } $map{$source->result_class} = $moniker; @@ -617,31 +617,24 @@ will produce the output sub compose_namespace { my ($self, $target, $base) = @_; - my $schema = $self->clone; - { - no warnings qw/redefine/; - local *Class::C3::reinitialize = sub { }; - foreach my $moniker ($schema->sources) { - my $source = $schema->source($moniker); - my $target_class = "${target}::${moniker}"; - $self->inject_base( - $target_class => $source->result_class, ($base ? $base : ()) - ); - $source->result_class($target_class); - $target_class->result_source_instance($source) - if $target_class->can('result_source_instance'); - } - } - Class::C3->reinitialize(); - { - no strict 'refs'; - no warnings 'redefine'; - foreach my $meth (qw/class source resultset/) { - my $name = join '::', $target, $meth; - *$name = Sub::Name::subname $name, sub { shift->schema->$meth(@_) }; - } + + $self = $self->clone; + foreach my $moniker ($self->sources) { + my $source = $self->source($moniker); + my $source_class = ref $source; + my $source_copy = $source_class->new({ + %$source, + _relationships => Storable::dclone( $source->_relationships ), + }); + + my $target_class = "${target}::${moniker}"; + $self->inject_base( + $target_class => $source_copy->result_class, ($base ? $base : ()) + ); + $source_copy->result_class($target_class); + $self->register_source($moniker, $source_copy); } - return $schema; + return $self; } sub setup_connection_class { diff --git a/t/47bind_attribute.t b/t/47bind_attribute.t index afc5b1a..8f66f6c 100644 --- a/t/47bind_attribute.t +++ b/t/47bind_attribute.t @@ -60,7 +60,7 @@ $new_source->name(\<<''); join cd on cd.artist=a.artistid where cd.year=?) -$schema->register_source('Complex' => $new_source); +$schema->register_extra_source('Complex' => $new_source); $rs = $schema->resultset('Complex')->search({}, { bind => [ 1999 ] }); is ( $rs->count, 1, 'cookbook arbitrary sql example' );