Introduce GOVERNANCE document and empty RESOLUTIONS file.
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / Statistics.pm
index c8162bf..f521658 100644 (file)
@@ -1,11 +1,13 @@
 package DBIx::Class::Storage::Statistics;
+
 use strict;
 use warnings;
 
-use base qw/Class::Accessor::Grouped/;
-use IO::File;
-
-__PACKAGE__->mk_group_accessors(simple => qw/callback debugfh silence/);
+use DBIx::Class::_Util qw(sigwarn_silencer qsub);
+use IO::Handle ();
+use Moo;
+extends 'DBIx::Class';
+use namespace::clean;
 
 =head1 NAME
 
@@ -25,32 +27,60 @@ for collecting the statistics as discussed in L<DBIx::Class::Manual::Cookbook>.
 
 =head1 METHODS
 
-=cut
-
 =head2 new
 
 Returns a new L<DBIx::Class::Storage::Statistics> object.
 
+=head2 debugfh
+
+Sets or retrieves the filehandle used for trace/debug output.  This should
+be an L<IO::Handle> compatible object (only the
+L<< print|IO::Handle/METHODS >> method is used). By
+default it is initially set to STDERR - although see discussion of the
+L<DBIC_TRACE|DBIx::Class::Storage/DBIC_TRACE> environment variable.
+
+Invoked as a getter it will lazily open a filehandle and set it to
+L<< autoflush|perlvar/HANDLE->autoflush( EXPR ) >> (if one is not
+already set).
+
 =cut
-sub new {
-  my $self = {};
-  bless $self, (ref($_[0]) || $_[0]);
 
-  return $self;
-}
+has debugfh => (
+  is => 'rw',
+  lazy => 1,
+  trigger => qsub '$_[0]->_defaulted_to_stderr(undef); $_[0]->_clear_debugfh unless $_[1];',
+  clearer => '_clear_debugfh',
+  builder => '_build_debugfh',
+);
 
-=head2 debugfh
+sub _build_debugfh {
+  my $fh;
 
-Sets or retrieves the filehandle used for trace/debug output.  This should
-be an IO::Handle compatible object (only the C<print> method is used). Initially
-should be set to STDERR - although see information on the
-L<DBIC_TRACE> environment variable.
+  my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG} || $ENV{DBIC_TRACE};
+
+  if (defined($debug_env) and ($debug_env =~ /=(.+)$/)) {
+    open ($fh, '>>', $1)
+      or die("Cannot open trace file $1: $!\n");
+  }
+  else {
+    open ($fh, '>&STDERR')
+      or die("Duplication of STDERR for debug output failed (perhaps your STDERR is closed?): $!\n");
+    $_[0]->_defaulted_to_stderr(1);
+  }
+
+  $fh->autoflush(1);
+
+  $fh;
+}
+
+has [qw(_defaulted_to_stderr silence callback)] => (
+  is => 'rw',
+);
 
 =head2 print
 
-Prints the specified string to our debugging filehandle, which we will attempt
-to open if we haven't yet.  Provided to save our methods the worry of how
-to display the message.
+Prints the specified string to our debugging filehandle.  Provided to save our
+methods the worry of how to display the message.
 
 =cut
 sub print {
@@ -58,23 +88,13 @@ sub print {
 
   return if $self->silence;
 
-  if(!defined($self->debugfh())) {
-    my $fh;
-    my $debug_env = $ENV{DBIX_CLASS_STORAGE_DBI_DEBUG}
-                  || $ENV{DBIC_TRACE};
-    if (defined($debug_env) && ($debug_env =~ /=(.+)$/)) {
-      $fh = IO::File->new($1, 'w')
-        or die("Cannot open trace file $1");
-    } else {
-      $fh = IO::File->new('>&STDERR')
-        or die('Duplication of STDERR for debug output failed (perhaps your STDERR is closed?)');
-    }
-
-    $fh->autoflush();
-    $self->debugfh($fh);
-  }
+  my $fh = $self->debugfh;
 
-  $self->debugfh->print($msg);
+  # not using 'no warnings' here because all of this can change at runtime
+  local $SIG{__WARN__} = sigwarn_silencer(qr/^Wide character in print/)
+    if $self->_defaulted_to_stderr;
+
+  $fh->print($msg);
 }
 
 =head2 silence
@@ -184,18 +204,22 @@ sub query_start {
 Called when a query finishes executing.  Has the same arguments as query_start.
 
 =cut
+
 sub query_end {
   my ($self, $string) = @_;
 }
 
-1;
-
-=head1 AUTHORS
+=head1 FURTHER QUESTIONS?
 
-Cory G. Watson <gphat@cpan.org>
+Check the list of L<additional DBIC resources|DBIx::Class/GETTING HELP/SUPPORT>.
 
-=head1 LICENSE
+=head1 COPYRIGHT AND LICENSE
 
-You may distribute this code under the same license as Perl itself.
+This module is free software L<copyright|DBIx::Class/COPYRIGHT AND LICENSE>
+by the L<DBIx::Class (DBIC) authors|DBIx::Class/AUTHORS>. You can
+redistribute it and/or modify it under the same terms as the
+L<DBIx::Class library|DBIx::Class/COPYRIGHT AND LICENSE>.
 
 =cut
+
+1;