reverted back to previous compose_namespace method with minor change
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Schema.pm
index ddef110..3e9d93e 100644 (file)
@@ -97,7 +97,32 @@ moniker.
 =cut
 
 sub register_source {
-  my ($self, $moniker, $source) = @_;
+  my $self = shift;
+
+  $self->_register_source(@_);
+}
+
+=head2 register_extra_source
+
+=over 4
+
+=item Arguments: $moniker, $result_source
+
+=back
+
+As L</register_source> but should be used if the result class already 
+has a source and you want to register an extra one.
+
+=cut
+
+sub register_extra_source {
+  my $self = shift;
+
+  $self->_register_source(@_, { extra => 1 });
+}
+
+sub _register_source {
+  my ($self, $moniker, $source, $params) = @_;
 
   %$source = %{ $source->new( { %$source, source_name => $moniker }) };
 
@@ -106,10 +131,14 @@ 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}) {
+      warn $source->result_class . ' already has a source, use register_extra_source for additional sources';
+    }
     $map{$source->result_class} = $moniker;
     $self->class_mappings(\%map);
   }
@@ -586,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}";
@@ -601,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;
@@ -880,10 +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->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;