start using Class::C3, may need to add a reinitalize bit later, not sure
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Log.pm
index 809294e..3f67952 100644 (file)
@@ -1,14 +1,14 @@
 package Catalyst::Log;
 
-use strict;
-use base 'Class::Accessor::Fast';
-use Data::Dumper;
+use Class::C3;
+use Moose;
+use Data::Dump;
 
 our %LEVELS = ();
 
-__PACKAGE__->mk_accessors('level');
-__PACKAGE__->mk_accessors('body');
-__PACKAGE__->mk_accessors('abort');
+has level => (is => 'rw');
+has _body => (is => 'rw');
+has abort => (is => 'rw');
 
 {
     my @levels = qw[ debug info warn error fatal ];
@@ -25,21 +25,21 @@ __PACKAGE__->mk_accessors('abort');
         *{$name} = sub {
             my $self = shift;
 
-            if ( $self->{level} & $level ) {
+            if ( $self->level & $level ) {
                 $self->_log( $name, @_ );
             }
         };
 
         *{"is_$name"} = sub {
             my $self = shift;
-            return $self->{level} & $level;
+            return $self->level & $level;
         };
     }
 }
 
 sub new {
     my $class = shift;
-    my $self  = $class->SUPER::new;
+    my $self = $class->next::method;
     $self->levels( scalar(@_) ? @_ : keys %LEVELS );
     return $self;
 }
@@ -52,40 +52,56 @@ sub levels {
 
 sub enable {
     my ( $self, @levels ) = @_;
-    $self->{level} |= $_ for map { $LEVELS{$_} } @levels;
+    my $level = $self->level;
+    for(map { $LEVELS{$_} } @levels){
+      $level |= $_;
+    }
+    $self->level($level);
 }
 
 sub disable {
     my ( $self, @levels ) = @_;
-    $self->{level} &= ~$_ for map { $LEVELS{$_} } @levels;
+    my $level = $self->level;
+    for(map { $LEVELS{$_} } @levels){
+      $level &= ~$_;
+    }
+    $self->level($level);
 }
 
 sub _dump {
     my $self = shift;
-    local $Data::Dumper::Terse = 1;
-    $self->info( Dumper( @_ ) );
+    $self->info( Data::Dump::dump(@_) );
 }
 
 sub _log {
     my $self    = shift;
     my $level   = shift;
-    my $time    = localtime(time);
     my $message = join( "\n", @_ );
-    $self->{body} .=
-      sprintf( "[%s] [catalyst] [%s] %s\n", $time, $level, $message );
+    $message .= "\n" unless $message =~ /\n$/;
+    my $body = $self->_body;
+    $body .= sprintf( "[%s] %s", $level, $message );
+    $self->_body($body);
 }
 
 sub _flush {
     my $self = shift;
-    if ( $self->abort || !$self->body ) {
+    if ( $self->abort || !$self->_body ) {
         $self->abort(undef);
     }
     else {
-        print( STDERR $self->body );
+        $self->_send_to_log( $self->_body );
     }
-    $self->body(undef);
+    $self->_body(undef);
+}
+
+sub _send_to_log {
+    my $self = shift;
+    print STDERR @_;
 }
 
+no Moose;
+__PACKAGE__->meta->make_immutable();
+
 1;
 
 __END__
@@ -112,14 +128,22 @@ See L<Catalyst>.
 
 =head1 DESCRIPTION
 
-This module provides the default, simple logging functionality for
-Catalyst.
-If you want something different set C<$c->log> in your application
-module, e.g.:
+This module provides the default, simple logging functionality for Catalyst.
+If you want something different set C<< $c->log >> in your application module,
+e.g.:
 
     $c->log( MyLogger->new );
 
 Your logging object is expected to provide the interface described here.
+Good alternatives to consider are Log::Log4Perl and Log::Dispatch.
+
+If you want to be able to log arbitrary warnings, you can do something along
+the lines of
+
+    $SIG{__WARN__} = sub { MyApp->log->warn(@_); };
+
+however this is (a) global, (b) hairy and (c) may have unexpected side effects.
+Don't say we didn't warn you.
 
 =head1 LOG LEVELS
 
@@ -158,6 +182,10 @@ arguments.
     $log = Catalyst::Log->new;
     $log = Catalyst::Log->new( 'warn', 'error' );
 
+=head2 level
+
+Contains a bitmask of the currently set log levels.
+
 =head2 levels
 
 Set log levels
@@ -198,6 +226,16 @@ to use Log4Perl or another logger, you should call it like this:
 
     $c->log->abort(1) if $c->log->can('abort');
 
+=head2 _send_to_log
+
+ $log->_send_to_log( @messages );
+
+This protected method is what actually sends the log information to STDERR.
+You may subclass this module and override this method to get finer control
+over the log output.
+
+=head2 meta
+
 =head1 SEE ALSO
 
 L<Catalyst>.
@@ -215,4 +253,6 @@ it under the same terms as Perl itself.
 
 =cut
 
+__PACKAGE__->meta->make_immutable;
+
 1;