use connection hack only for schema_base_class
Rafael Kitover [Tue, 25 Oct 2011 20:56:48 +0000 (16:56 -0400)]
Use the horrible mro hack in ::Loader::connection only if
schema_base_class and/or schema_components were defined.

Add warnings to the POD for these options that dynamic schemas cannot
define a connection method.

lib/DBIx/Class/Schema/Loader.pm
lib/DBIx/Class/Schema/Loader/Base.pm

index 78b0507..1c7b649 100644 (file)
@@ -244,10 +244,9 @@ sub connection {
             if $temp_loader->schema_base_class;
 
         $self->load_components(@components);
-    }
 
-    # This hack is necessary if we changed @ISA of $self through ->load_components.
-    {
+        # This hack is necessary because we changed @ISA of $self through
+        # ->load_components.
         no warnings 'redefine';
 
         local *connection = subname __PACKAGE__.'::connection' => sub {
@@ -257,6 +256,9 @@ sub connection {
 
         $self = $self->connection(@_);
     }
+    else {
+        $self = $self->next::method(@_);
+    }
 
     my $class = ref $self || $self;
     if(!$class->_loader_invoked) {
index 1633327..b2c99c7 100644 (file)
@@ -545,6 +545,19 @@ Default behavior is to utilize L<Lingua::EN::Inflect::Phrase/to_S>.
 
 Base class for your schema classes. Defaults to 'DBIx::Class::Schema'.
 
+B<WARNING>: if you define schema_base_class for a dynamic schema, you cannot
+define a L<connection|DBIx::Class::Schema/connection> method in your schema
+class, it must be in the schema base class, due to the limits of L<mro>.
+
+=head2 schema_components
+
+List of components to load into the Schema class.
+
+B<WARNING>: if you define schema_components for a dynamic schema, you cannot
+define a L<connection|DBIx::Class::Schema/connection> method in your schema
+class, it must be in L</schema_base_class> or a component, due to the limits of
+L<mro>.
+
 =head2 result_base_class
 
 Base class for your table classes (aka result classes). Defaults to
@@ -563,10 +576,6 @@ that need to be leftmost.
 
 List of additional classes which all of your table classes will use.
 
-=head2 schema_components
-
-List of components to load into the Schema class.
-
 =head2 components
 
 List of additional components to be loaded into all of your Result