The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#  File: Stem/Trace.pm

#  This file is part of Stem.
#  Copyright (C) 1999, 2000, 2001 Stem Systems, Inc.

#  Stem is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 2 of the License, or
#  (at your option) any later version.

#  Stem is distributed in the hope that it will be useful,
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#  GNU General Public License for more details.

#  You should have received a copy of the GNU General Public License
#  along with Stem; if not, write to the Free Software
#  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

#  For a license to use the Stem under conditions other than those
#  described here, to purchase support for this software, or to purchase a
#  commercial warranty contract, please contact Stem Systems at:

#       Stem Systems, Inc.		781-643-7504
#  	79 Everett St.			info@stemsystems.com
#  	Arlington, MA 02474
#  	USA

package Stem::Trace ;

use strict;

use Stem::Vars ;
use Stem::Log::Entry ;

sub import {

	my( $class, %trace_args ) = @_ ;

	$class = caller ;

	my $sub              = $trace_args{ 'sub' }        || 'Trace' ;
	my $type             = $trace_args{ 'type' }       || 'textlist' ;
	my $def_level        = $trace_args{ 'level' }      || 5 ;
	my $def_label        = $trace_args{ 'label' }      || 'trace' ;
	my $def_log          = $trace_args{ 'log' }        || 'trace' ;
	my $def_env          = $trace_args{ 'env' }        || "$class\::$sub" ;
	my $def_env_level    = $trace_args{ 'env_level' }  || 0 ;
	my $def_prefix       = $trace_args{ 'prefix' }     || '%P-%L - ' ;

	no strict 'refs';

	if ( $type eq 'args' ) {

		*{ "${class}::$sub" } = sub {

			return if
				( $Stem::Vars::Env{ $def_env } || 0 ) <
							$def_env_level ;

			my $prefix = $def_prefix ;
			my( $line_num ) = (caller)[2] ;

			$prefix =~ s/%P/$class/ ;
			$prefix =~ s/%L/$line_num/ ;

# if only 1 arg, it is text.
# if 2 args, it is level, text
# if 3 args, it is label, level, text

			my $text = pop ;
			my $level = pop || $def_level ;
			my $label = pop || $def_label ;
			my $log = pop || $def_log ;

			Stem::Log::Entry->new (
			       'logs'	=> $log,
			       'level'	=> $level,
			       'label'	=> $label,
			       'text'	=> "$prefix$text\n"
			) ;
		} ;

		return ;
	}

	if ( $type eq 'keyed' ) {

		*{ "${class}::$sub" } = sub {

			my ( %args ) = @_;

			my $env	      = $args{ 'env' }   || $def_env ;
			my $env_level = $args{ 'env_level' } || $def_env_level ;

			return if
				( $Stem::Vars::Env{ $env } || 0 ) < $env_level ;

			my $text      = $args{ 'text' }   || '' ;
			my $log	      = $args{ 'log' }    || $def_log ;
			my $level     = $args{ 'level' }  || $def_level ;
			my $label     = $args{ 'label' }  || $def_label ;
			my $prefix    = $args{ 'prefix' } || $def_prefix ;

			my( $line_num ) = (caller)[2] ;
			$prefix =~ s/%P/$class/ ;
			$prefix =~ s/%L/$line_num/ ;

			Stem::Log::Entry->new (
				'logs'	=> $log,
				'level'	=> $level,
				'label'	=> $label,
				'text'	=> "$prefix$text\n",
			) ;
		} ;

		return ;
	}

	if ( $type eq 'textlist' ) {

		*{ "${class}::$sub" } = sub {

			return if
				( $Stem::Vars::Env{ $def_env } || 0 ) <
							$def_env_level ;

			my $text = join '', @_ ;

			my( $line_num ) = (caller)[2] ;

			my $prefix = $def_prefix ;

			$prefix =~ s/%P/$class/ ;
			$prefix =~ s/%L/$line_num/ ;


			Stem::Log::Entry->new (
			       'logs'	=> $def_log,
			       'level'	=> $def_level,
			       'label'	=> $def_label,
			       'text'	=> "$prefix$text\n",
			) ;
		} ;

		return ;
	}
}

1 ;