The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package MColPro::Util::Logger;

=head1 NAME

 MColPro::Util::Logger - logger

=cut

use strict;
use warnings;

use Carp;
use POSIX;
use Thread::Semaphore;

our $HANDLE = \*STDERR;

sub new
{
    my ( $class, $handle ) = splice @_;
    confess 'cannot write to handle' unless -w ( $handle ||= $HANDLE );
    bless { handle => $handle, mutex => Thread::Semaphore->new() },
        ref $class || $class;
}

sub say
{
    my $self = shift;
    my $handle = $self->{handle};
    if ( @_ )
    {
        $self->{mutex}->down();
        syswrite $handle, POSIX::sprintf( @_ ) . "\n";
        $self->{mutex}->up();
    }
    return $self;
}

1;