Revision 3 (by ahitrov@rambler.ru, 2010/03/24 15:19:32) The CORE
package Contenido::Msg;

use strict;
use warnings;

use Contenido::Globals;

use vars qw (@EXPORT @ISA %HANDLERS);

require Exporter;
@ISA = qw(Exporter);

@EXPORT = qw(&msg);

#������� �� ������� ������ &debug � ��� log_handlers
%HANDLERS = (
		debug	=> \&default_warn_handler,
		log	=> \&default_warn_handler,
		logging	=> \&default_warn_handler,
		warn	=> \&default_warn_handler,
		warning	=> \&default_warn_handler,
		err	=> \&default_warn_handler,
		error	=> \&default_warn_handler,
		crit	=> \&default_warn_handler,
		sql	=> \&default_sql_handler,
	    );

sub msg {
	my ($msg, $tag) = @_;
	$tag = lc($tag);

	#��� handler �� ����� ��� ��������� ��� ������ handler �����
	unless ($tag and exists($HANDLERS{$tag}) and (ref($HANDLERS{$tag}) eq 'CODE')) {
		warn "�� ��������� ��� ������������ handler ��� ��������� ����: '$tag'\n";
		return undef;
	}

	my ($package, $filename, $line) = caller();
	my @caller = caller(1);
	my $subroutine;

	if ( $caller[3] =~ /::(\w+)$/ ) {
		$subroutine = $1;
	} else {
		$subroutine = caller[3];
	}

	#��������� ������ �� ������ � ����������� �������
	my $string = 'Contenido '.$tag.' ['.scalar(localtime).'] '.$$.': '.$package.'/'.$line.' '.$subroutine.': '.$msg;

	#�������� handler ��������� ���������
	eval { $HANDLERS{$tag}->($string, $tag) };
	warn "Error $@ in handler $tag\n" if ($@);
}

sub default_warn_handler {
	my ($string, $tag) = @_;
	#���������� ���� ��� ��������� debug � ������� ����������
	warn $string."\n" unless ($tag eq 'debug' and  !$DEBUG);
}

sub default_sql_handler {
	my ($string, $tag) = @_;
	#������ ��� $DEBUG_SQL ��������������
	warn $string."\n" if ($DEBUG_SQL);
}

1;