| ProgressMonitor documentation | Contained in the ProgressMonitor distribution. |
ProgressMonitor::Stringify::ToCallback - a monitor implementation that provides stringified feedback to a callback.
...
# call someTask and give it a monitor to call us back
# on callback, just do something unimaginative (print it...:-) and return 0 (don't cancel)
#
someTask(ProgressMonitor::Stringify::ToCallback->new({fields => [ ... ], tickCallback => sub { print "GOT: ", shift(), "\n"; 0; });
This is a concrete implementation of a ProgressMonitor. It will send the stringified feedback to a callback (code ref) supplied by the user.
Inherits from ProgressMonitor::Stringify::AbstractMonitor.
Note that the maxWidth must be set explicitly.
Configuration data:
A code reference to an anonymous sub. For each rendering tick, it will be called with the rendered string as the argument. The return value will be used to set the cancellation status.
A code reference that will be called specifically with the current message. Note that setting this changes the behavior of tickCallback; normally, tickCallback will receive the rendered string including any message. However, by setting messageCallback, the message will be skipped during rendition of the ordinary fields. Also, if this is set, the strategy used is of no importance.
A code reference that will be called with the current error message.
Kenneth Olwing, <knth at cpan.org>
I wouldn't be surprised! If you can come up with a minimal test that shows the problem I might be able to take a look. Even better, send me a patch.
Please report any bugs or feature requests to
bug-progressmonitor at rt.cpan.org, or through the web interface at
http://rt.cpan.org/NoAuth/ReportBug.html?Queue=ProgressMonitor.
I will be notified, and then you'll automatically be notified of progress on
your bug as I make changes.
You can find general documentation for this module with the perldoc command:
perldoc ProgressMonitor
Thanks to my family. I'm deeply grateful for you!
Copyright 2006,2007 Kenneth Olwing, all rights reserved.
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
| ProgressMonitor documentation | Contained in the ProgressMonitor distribution. |
package ProgressMonitor::Stringify::ToCallback; use warnings; use strict; require ProgressMonitor::Stringify::AbstractMonitor if 0; use classes extends => 'ProgressMonitor::Stringify::AbstractMonitor', new => 'new', ; sub new { my $class = shift; my $cfg = shift; my $self = $class->SUPER::_new($cfg, $CLASS); return $self; } sub render { my $self = shift; # call the tick callback with the normal rendering # unless the message callback is set, then don't render message # and pass that separately to the msg callback # my $cfg = $self->_get_cfg; my $tcb = $cfg->get_tickCallback; my $mcb = $cfg->get_messageCallback; my $cancel = $tcb->($self->_toString($mcb ? 0 : 1)); if ($mcb) { my $msg = $self->_get_message; $mcb->($msg) if $msg; } $self->setCanceled($cancel) unless $self->isCanceled; return; } sub setErrorMessage { my $self = shift; my $msg = $self->SUPER::setErrorMessage(shift()); my $emcb = $self->_get_cfg->get_errorMessageCallback; $emcb->($msg) if $emcb; } ### package ProgressMonitor::Stringify::ToCallbackConfiguration; use strict; use warnings; # Attributes: # callback (code ref) # The callback will be called with the rendered string and should return a # boolean, which will be used to set the cancellation status with. use classes extends => 'ProgressMonitor::Stringify::AbstractMonitorConfiguration', attrs => ['tickCallback', 'messageCallback', 'errorMessageCallback'], ; sub defaultAttributeValues { my $self = shift; return { %{$self->SUPER::defaultAttributeValues()}, tickCallback => sub { X::Usage->throw("missing tickCallback"); 1; }, messageCallback => undef, errorMessageCallback => undef, }; } sub checkAttributeValues { my $self = shift; $self->SUPER::checkAttributeValues(); X::Usage->throw("tickCallback is not a code ref") unless ref($self->get_tickCallback) eq 'CODE'; my $mcb = $self->get_messageCallback; X::Usage->throw("messageCallback is not a code ref") if ($mcb && ref($mcb) ne 'CODE'); my $emcb = $self->get_errorMessageCallback; X::Usage->throw("errorMessageCallback is not a code ref") if ($emcb && ref($emcb) ne 'CODE'); X::Usage->throw("maxWidth not set") unless $self->get_maxWidth; return; } ############################
1; # End of ProgressMonitor::Stringify::ToCallback