The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Plack::Middleware::Log::Contextual::Logger;
use strict;

my @levels = (qw( trace debug info warn error fatal ));

my %level_num;
@level_num{ @levels } = (0 .. $#levels);
for my $name (@levels) {
    no strict 'refs';
    my $is_name = "is_$name";
    *{$name} = sub {
        my $self = shift;
        my $level = $name eq "trace" ? "debug" : $name;
        $self->{logger}->({
            level => $level,
            message => $_[0],
        }) if $self->$is_name;
    };
    *{$is_name} = sub {
        my $self = shift;
        my $upto = lc $self->{level} || 'debug';
        return $level_num{$name} >= $level_num{$upto};
    };
}

sub new {
    my($class, $logger, $level) = @_;
    bless { logger => $logger, level => $level }, $class;
}

1;