# Copyright (c) 2008 Behan Webster. All rights reserved. This program is free # software; you can redistribute it and/or modify it under the same terms # as Perl itself. package Debug::Simple; use strict; require Exporter; use Data::Dumper; use Term::ANSIColor qw(:constants); $Term::ANSIColor::AUTORESET = 1; use vars qw(@EXPORT @ISA $VERSION); $VERSION = "0.10"; @ISA = qw(Exporter); @EXPORT = qw(debuglevels warning debug verbose test); my $opt; ############################################################################### sub debuglevels { # Needs to have the keys: quiet, debug, verbose, test ($opt) = @_; &debug(5, "Command line options: ", OPTS => $opt); } ############################################################################### sub _list { return (ref($_[0]) eq 'ARRAY') ? @{$_[0]} : @_; } ############################################################################### sub warning { return if $opt->{quiet}; #warn ("Warning: ", @_); print YELLOW ("Warning: ", @_); print ""; } ############################################################################### sub debug { return if $opt->{quiet}; my @level = (&_list(shift), 0, 0, 0); return unless (defined $opt->{debug} && $level[0] <= $opt->{debug}) || ($opt->{verbose} && $level[1] && $level[1] <= $opt->{verbose}) || ($opt->{test} && $level[2]); #print "DEBUG\n" if defined $opt->{debug} && $level[0] <= $opt->{debug}; #print "VERBOSE: $opt->{verbose} && $level[1]\n" if defined $opt->{verbose} && $level[1] <= $opt->{verbose}; #print "TEST\n" if defined $opt->{test} && $level[3]; my $str = shift || ''; my $name = shift; print BOLD "Debug: " unless $level[1] || $level[2]; print BOLD "$str"; if ($name && @_) { my $save = $Data::Dumper::Varname; $Data::Dumper::Varname = $name; print BOLD Dumper(@_); $Data::Dumper::Varname = $save; } print ""; } ############################################################################### sub verbose { return if $opt->{quiet}; my @level = (&_list(shift), 0, 0); return unless ($opt->{verbose} && $level[0] && $level[0] <= $opt->{verbose}) || ($opt->{test} && $level[1]); print @_; print ""; } ############################################################################### sub test { my $code = shift; my $str = shift || $code; if ($opt->{test}) { print CYAN "$str\n"; } else { eval $code; print MAGENTA "Eval failed: $@\n" if $@; return $@; } print ""; } 1; ############################################################################### __END__ =head1 NAME Debug::Simple - Very simple debugging statements =head1 SYNOPSIS use Debug::Simple; my %opt = (quiet => 0, debug => 4, verbose => 1, test => 0); Debug::Simple::debuglevels(\%opt); warning("This is a warning\m"); debug(1, "This is a level 3 debug message\n"); debug(2, "This is a level 2 debug message with a Dump", NAME => \%opt); verbose(1, "This is a verbose message\n"); test('print "test code"'); =head1 DESCRIPTION This module provides a very simple way to provide debug/verbose/warning messages. It is also trivially controlled via Getopt::Long. The idea is to be able to put a bunch of debugging print statements throughout your code that you can enable or disable. =over 4 =item debuglevels(\%OPT) C registers the hashref C as the place to read values used to control whether text is output to the screen or not. There are 4 values read from this hash: quiet, debug, verbose, and test. =over =item quiet If non-zero, this will repress all output from Debug::Simple =item debug This indicates the level of debug messages desired. A debug level of 4 prints all the debug messages from levels 1 to 4. =item verbose Like debug, this sets the level of verboseness. A verbose level of 3 prints all verbose messages from 1 to 3. =item test If non-zero, the code passed to test() will be printed to the screen instead of being executed. =back =item warning(STRING) C prints the C to stdout in YELLOW unless the "quiet" level is non-zero (see C). C is prefaced with "Warning:". =item debug(LEVEL, STRING, [NAME => REF]) C prints a debugging message to stdout as long as C is at or below the "debug" level. (see , and then optionally uses Data::Dumper to dump a data structure referred to by C. C is just a human readable name for C passed to Data::Dumper. =item verbose(LEVEL, STRING) C prints C to stdout as long as C is at or below the "verbose" level. (see C). =item test(CODE) C executes C according to the "test" level. (see C). If the "test" level is non-zero the code is printed to stdout instead of being executed. =back =head1 LEVELS To make things marginally more useful, you can specify that a message can be printed to stdout based on more than one level by specifying a list of levels. For instance, for C you can also specify the "verbose" and "test" levels at which the debug message will be printed. In the following example, the debug message will be output at debug levels 1-2, verbose levels 1-3 or test level 1. &debug([2,3,1], "This is a debug message\n"); In this case, the message will be printed to stdout if the verbose level is 1-2 or test level 1. &verbose([2,1], "This is a verbose message\n"); =head1 EXAMPLE CODE This example shows how Debug::Simple code can be tied in with GetOpt::Long. use Debug::Simple; use Getopt::Long; use Pod::Usage; pod2usage(2) unless GetOptions( $opt = {}, qw(help debug:i quiet test verbose|v+) ); pod2usage(1) if $opt->{help}; $opt->{debug} = 1 if defined $opt->{debug} && !$opt->{debug}; Debug::Simple::debuglevels($opt); debug(2, "Command line options ", OPT=>$opt); verbose(1, "Now on with the show\n"); ... =head1 AUTHOR Sbehanw@websterwood.com> =head1 COPYRIGHT Copyright (c) 2004-2008 Behan Webster. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut