+{
+ package LWP::MyUserAgent;
+
+ our @ISA;
+ BEGIN { push @ISA, 'LWP::UserAgent' }
+
+ my %cbs;
+ my %ticks;
+
+ sub new {
+ my ($class, $cb) = @_;
+
+ my $ua = bless LWP::UserAgent->new, $class;
+ $ua->timeout(10);
+ $ua->show_progress(1) if $cb;
+
+ my $tag = Scalar::Util::refaddr($ua);
+ $cbs{$tag} = $cb;
+ $ticks{$tag} = 0;
+
+ return $ua;
+ }
+
+ sub progress {
+ my ($ua, $stat, $r) = @_;
+
+ my $tag = Scalar::Util::refaddr($ua);
+ my $cb = $cbs{$tag};
+ return unless $cb;
+
+ my $desc;
+ if ($stat eq 'begin') {
+ $desc = '...';
+ } elsif ($stat eq 'end') {
+ $desc = 'done';
+ } elsif ($stat eq 'tick') {
+ my $tick = ++$ticks{$tag};
+ $desc = qw<- \ | />[$tick % 4];
+ } else {
+ $desc = sprintf "%.01f%%", 100 * $stat;
+ }
+
+ $cb->($stat, $desc);
+
+ return;
+ }
+
+ sub DESTROY {
+ my $ua = shift;
+
+ my $tag = Scalar::Util::refaddr($ua);
+
+ delete $cbs{$tag};
+ delete $ticks{$tag};
+
+ return;
+ }
+}
+