X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FSchema.pm;h=3e9d93e7b683a1a961e0fba934f73efbb2999ef4;hb=5b0b4df82267d761f34c606a1f97b6950a2eed4a;hp=7f7fb37c68e8486dbf03491f82fde7d9f178438b;hpb=2a4d9487f09d04cde419d6840e06b9be5a880a23;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Schema.pm b/lib/DBIx/Class/Schema.pm index 7f7fb37..3e9d93e 100644 --- a/lib/DBIx/Class/Schema.pm +++ b/lib/DBIx/Class/Schema.pm @@ -131,10 +131,9 @@ sub _register_source { $self->source_registrations(\%reg); $source->schema($self); - + weaken($source->{schema}) if ref($self); return if ($params->{extra}); - weaken($source->{schema}) if ref($self); if ($source->result_class) { my %map = %{$self->class_mappings}; if (exists $map{$source->result_class}) { @@ -616,12 +615,31 @@ will produce the output =cut +# this might be oversimplified +# sub compose_namespace { +# my ($self, $target, $base) = @_; + +# my $schema = $self->clone; +# 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'); +# $schema->register_source($moniker, $source); +# } +# return $schema; +# } + sub compose_namespace { my ($self, $target, $base) = @_; my $schema = $self->clone; { no warnings qw/redefine/; - local *Class::C3::reinitialize = sub { }; +# local *Class::C3::reinitialize = sub { }; foreach my $moniker ($schema->sources) { my $source = $schema->source($moniker); my $target_class = "${target}::${moniker}"; @@ -631,15 +649,16 @@ sub compose_namespace { $source->result_class($target_class); $target_class->result_source_instance($source) if $target_class->can('result_source_instance'); + $schema->register_source($moniker, $source); } } - Class::C3->reinitialize(); +# 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(@_) }; + *{"${target}::${meth}"} = + sub { shift->schema->$meth(@_) }; } } return $schema; @@ -910,11 +929,14 @@ sub clone { my $clone = { (ref $self ? %$self : ()) }; bless $clone, (ref $self || $self); + $clone->class_mappings({ %{$clone->class_mappings} }); + $clone->source_registrations({ %{$clone->source_registrations} }); foreach my $moniker ($self->sources) { my $source = $self->source($moniker); my $new = $source->new($source); - $clone->_unregister_source($moniker); - $clone->register_source($moniker => $new); + # we use extra here as we want to leave the class_mappings as they are + # but overwrite the source_registrations entry with the new source + $clone->register_extra_source($moniker => $new); } $clone->storage->set_schema($clone) if $clone->storage; return $clone;