The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

package Test::Continuous::Notifier;
use Log::Dispatch;
use Log::Dispatch::Screen;
use self;

{
    my $dispatcher;
    sub _dispatcher {
        return $dispatcher if $dispatcher;

        $dispatcher = Log::Dispatch->new;
        $dispatcher->add(
            Log::Dispatch::Screen->new(name => "screen", min_level => "debug")
        );

        eval {
            require Log::Dispatch::DesktopNotification;
            $dispatcher->add(
                Log::Dispatch::DesktopNotification->new(
                    name => "continuous_notify",
                    min_level => "debug",
                    app_name => "Test::Continuous",
                    title => "Test Report",
                    sticky => 0,
                ));
        };

        return $dispatcher;
    }
}

my %status_icon = (
    'alert'   => 'AlertCautionIcon.icns',
    'warning' => 'AlertStopIcon.icns',
    'info'    => 'ToolbarInfo.icns',
);

sub send_notify {
    my ($text, $status) = args;
    $status ||= 'info';
    if (my $notify = self->_dispatcher->remove("continuous_notify")) {
        $notify->{icon_file} = '/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/' .
            ($status_icon{$status} || 'ToolbarInfo.icns');
        self->_dispatcher->add($notify);
    }
    self->_dispatcher->$status($text);
}


1;

=head1 NAME

Test::Continuous::Notifier - Send notification to different targets.

=head1 SYNOPSIS

    Test::Continuous::Notifier->send_notify($msg, $status)

=head1 DESCRIPTION

This is used only internally.

=head1 METHODS

=over

=item send_notify($msg, [$status])

Must be called as a class method.

C<$msg> is required, and should contain trailing a C<\n> character in
case the output stream is not auto-flushing.

C<$status> is optional, and should be one of C<"info">, C<"warning">,
or C<"alert">. The default value is C<"info">.

=back

=cut