Merge the last bits of indirect callchain optimization
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Schema / SanityChecker.pm
index c6b3e50..ccfc0f3 100644 (file)
@@ -8,7 +8,6 @@ use DBIx::Class::_Util qw(
   describe_class_methods emit_loud_diag
 );
 use DBIx::Class ();
-use DBIx::Class::Exception ();
 use Scalar::Util qw( blessed refaddr );
 use namespace::clean;
 
@@ -21,7 +20,7 @@ DBIx::Class::Schema::SanityChecker - Extensible "critic" for your Schema class h
   package MyApp::Schema;
   use base 'DBIx::Class::Schema';
 
-  # this is the default on Perl v5.10 and later
+  # this is the default setting
   __PACKAGE__->schema_sanity_checker('DBIx::Class::Schema::SanityChecker');
   ...
 
@@ -30,8 +29,8 @@ DBIx::Class::Schema::SanityChecker - Extensible "critic" for your Schema class h
 This is the default implementation of the Schema and related classes
 L<validation framework|DBIx::Class::Schema/schema_sanity_checker>.
 
-The validator is B<enabled by default> on perls C<v5.10> and above. See
-L</Performance considerations> for discussion of the runtime effects.
+The validator is B<enabled by default>. See L</Performance considerations>
+for discussion of the runtime effects.
 
 Use of this class begins by invoking L</perform_schema_sanity_checks>
 (usually via L<DBIx::Class::Schema/connection>), which in turn starts
@@ -101,11 +100,6 @@ test execution time (these numbers are observed with the speedups of
 L<Class::C3::XS> available, without them the slowdown reaches the whopping
 C<350%>).
 
-Therefore, on these versions of perl the sanity checks are B<not enabled> by
-default. Instead a C<false> placeholder value is inserted into the
-L<schema_sanity_checker attribute|DBIx::Class::Schema/schema_sanity_checker>,
-urging the user to decide for themselves how to proceed.
-
 It is the author's B<strongest> recommendation to find a way to run the
 checks on your codebase continuously, even if it takes much longer. Refer to
 the last paragraph of L</Performance considerations> above for an example how
@@ -346,8 +340,8 @@ sub format_no_indirect_method_overrides_errors {
   . "chain of calls within the convenience shortcut as seen when running:\n  "
   . '~$ perl -M%2$s -MDevel::Dwarn -e "Ddie { %3$s => %2$s->can(q(%3$s)) }"',
     join (', ', map { "$_()" } sort @{ $_->{by} } ),
-    $_->{overriden}{via_class},
-    $_->{overriden}{name},
+    $_->{overridden}{via_class},
+    $_->{overridden}{name},
   )} @{ $_[1] } ]
 }
 
@@ -366,12 +360,21 @@ sub check_no_indirect_method_overrides {
     for (@$method_stack) {
 
       push @$nonsugar_methods, $_ and next
-        unless $_->{attributes}{DBIC_method_is_indirect_sugar};
+        unless(
+          $_->{attributes}{DBIC_method_is_indirect_sugar}
+            or
+          $_->{attributes}{DBIC_method_is_generated_from_resultsource_metadata}
+        );
 
       push @err, {
-        overriden => {
+        overridden => {
           name => $_->{name},
-          via_class => $_->{via_class}
+          via_class => (
+            # this way we report a much better Dwarn oneliner in the error
+            $_->{attributes}{DBIC_method_is_bypassable_resultsource_proxy}
+              ? 'DBIx::Class::ResultSource'
+              : $_->{via_class}
+          ),
         },
         by => [ map { "$_->{via_class}::$_->{name}" } @$nonsugar_methods ],
       } if (
@@ -506,7 +509,8 @@ sub check_valid_c3_composition {
 
     push @err, {
       class => $class,
-      isa => $desc->{isa},
+      initial_linear_isa => $desc->{linear_isa},
+      current_linear_isa => do { (undef, my @isa) = @{ mro::get_linear_isa($class) }; \@isa },
       initial_mro => $desc->{mro}{type},
       current_mro => mro::get_mro($class),
       affected_methods => $affected_methods,