Attach a storage debugobj lazily instead of at new() time
Peter Rabbitson [Sun, 14 Nov 2010 12:24:06 +0000 (13:24 +0100)]
lib/DBIx/Class/Storage.pm
lib/DBIx/Class/Storage/DBI.pm

index e26295b..6134b39 100644 (file)
@@ -13,7 +13,7 @@ use DBIx::Class::Storage::TxnScopeGuard;
 use Try::Tiny;
 use namespace::clean;
 
-__PACKAGE__->mk_group_accessors('simple' => qw/debug debugobj schema/);
+__PACKAGE__->mk_group_accessors('simple' => qw/debug schema/);
 __PACKAGE__->mk_group_accessors('inherited' => 'cursor_class');
 
 __PACKAGE__->cursor_class('DBIx::Class::Cursor');
@@ -63,34 +63,8 @@ sub new {
   bless $new, $self;
 
   $new->set_schema($schema);
-  my $debugobj;
-  if (my $profile = $ENV{DBIC_TRACE_PROFILE}) {
-    require DBIx::Class::Storage::Debug::PrettyPrint;
-    if ($profile =~ /^\.?\//) {
-      require Config::Any;
-
-      my $cfg = try {
-        Config::Any->load_files({ files => [$profile], use_ext => 1 });
-      } catch {
-        # sanitize the error message a bit
-        $_ =~ s/at \s+ .+ Storage\.pm \s line \s \d+ $//x;
-        $self->throw_exception("Failure processing \$ENV{DBIC_TRACE_PROFILE}: $_");
-      };
-
-      my ($filename, $config) = %{$cfg->[0]};
-      $debugobj = DBIx::Class::Storage::Debug::PrettyPrint->new($config)
-    } else {
-      $debugobj = DBIx::Class::Storage::Debug::PrettyPrint->new({ profile => $profile })
-    }
-  } else {
-    $debugobj = DBIx::Class::Storage::Statistics->new
-  }
-  $new->debugobj($debugobj);
-
-  my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG}
-                  || $ENV{DBIC_TRACE};
-
-  $new->debug(1) if $debug_env;
+  $new->debug(1)
+    if $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} || $ENV{DBIC_TRACE};
 
   $new;
 }
@@ -394,6 +368,42 @@ of L<DBIx::Class::Storage::Statistics> that is compatible with the original
 method of using a coderef as a callback.  See the aforementioned Statistics
 class for more information.
 
+=cut
+
+sub debugobj {
+  my $self = shift;
+
+  if (@_) {
+    return $self->{debugobj} = $_[0];
+  }
+
+  $self->{debugobj} ||= do {
+    if (my $profile = $ENV{DBIC_TRACE_PROFILE}) {
+      require DBIx::Class::Storage::Debug::PrettyPrint;
+      if ($profile =~ /^\.?\//) {
+        require Config::Any;
+
+        my $cfg = try {
+          Config::Any->load_files({ files => [$profile], use_ext => 1 });
+        } catch {
+          # sanitize the error message a bit
+          $_ =~ s/at \s+ .+ Storage\.pm \s line \s \d+ $//x;
+          $self->throw_exception("Failure processing \$ENV{DBIC_TRACE_PROFILE}: $_");
+        };
+
+        DBIx::Class::Storage::Debug::PrettyPrint->new(values %{$cfg->[0]});
+      }
+      else {
+        DBIx::Class::Storage::Debug::PrettyPrint->new({ profile => $profile });
+      }
+    }
+    else {
+      require DBIx::Class::Storage::Statistics;
+      DBIx::Class::Storage::Statistics->new
+    }
+  };
+}
+
 =head2 debugcb
 
 Sets a callback to be executed each time a statement is run; takes a sub
index c512334..cd2da9e 100644 (file)
@@ -10,7 +10,6 @@ use mro 'c3';
 use Carp::Clan qw/^DBIx::Class|^Try::Tiny/;
 use DBI;
 use DBIx::Class::Storage::DBI::Cursor;
-use DBIx::Class::Storage::Statistics;
 use Scalar::Util qw/refaddr weaken reftype blessed/;
 use Data::Dumper::Concise 'Dumper';
 use Sub::Name 'subname';