package Alex::Log; use strict; use warnings; use lib '/usr/local/alex/lib'; use Carp qw(croak); use Alex::DBI; sub new { my $class = shift; my %args = @_; croak "No program name given to constructor. ( program => 'foo' required )" unless exists $args{program}; my $pname = $args{program}; my $dbh = Alex::DBI->new; my ( $pid ) = $dbh->selectrow_array( "SELECT id FROM Log_Programs WHERE name = '$pname'" ); croak "Program $pname not in database" unless $pid; my $levels = $dbh->selectall_arrayref( "SELECT id, name FROM Log_Levels" ); foreach my $lev( @$levels ) { # install dynamic method my $lid = $lev->[0]; my $name = $lev->[1]; no strict 'refs'; *{ "Alex::Log::$name" } = sub { my $self = shift; my $msg = shift; # truncate msg if needed. if ( length( $msg ) > 2048 ) { $msg = substr $msg, 0, 2048; } $msg = "[PID:$$] " . $msg; my $sth = $dbh->prepare( "INSERT INTO Logs ( log_level_id, log_program_id, message ) VALUES ( ?, ?, ? )" ); $sth->execute( $lid, $pid, $msg ); }; } return bless { }, $class; } 1;