|  | package output; | 
|  |  | 
|  | use strict; | 
|  |  | 
|  | sub new { | 
|  | my $proto = shift; | 
|  | my $class = ref($proto) || $proto; | 
|  | my $self  = {}; | 
|  | bless ($self, $class); | 
|  |  | 
|  | my $progress = \${$self->{PROGRESS}}; | 
|  | my $last_progress = \${$self->{LAST_PROGRESS}}; | 
|  | my $progress_count = \${$self->{PROGRESS_COUNT}}; | 
|  | my $prefix = \${$self->{PREFIX}}; | 
|  |  | 
|  | $$progress = ""; | 
|  | $$last_progress = ""; | 
|  | $$progress_count = 0; | 
|  | $$prefix = ""; | 
|  |  | 
|  | return $self; | 
|  | } | 
|  |  | 
|  |  | 
|  | sub show_progress { | 
|  | my $self = shift; | 
|  | my $progress = \${$self->{PROGRESS}}; | 
|  | my $last_progress = \${$self->{LAST_PROGRESS}}; | 
|  | my $progress_count = \${$self->{PROGRESS_COUNT}}; | 
|  |  | 
|  | $$progress_count++; | 
|  |  | 
|  | if($$progress_count > 0 && $$progress) { | 
|  | print STDERR $$progress; | 
|  | $$last_progress = $$progress; | 
|  | } | 
|  | } | 
|  |  | 
|  | sub hide_progress  { | 
|  | my $self = shift; | 
|  | my $progress = \${$self->{PROGRESS}}; | 
|  | my $last_progress = \${$self->{LAST_PROGRESS}}; | 
|  | my $progress_count = \${$self->{PROGRESS_COUNT}}; | 
|  |  | 
|  | $$progress_count--; | 
|  |  | 
|  | if($$last_progress) { | 
|  | my $message; | 
|  | for (1..length($$last_progress)) { | 
|  | $message .= " "; | 
|  | } | 
|  | print STDERR $message; | 
|  | undef $$last_progress; | 
|  | } | 
|  | } | 
|  |  | 
|  | sub update_progress { | 
|  | my $self = shift; | 
|  | my $progress = \${$self->{PROGRESS}}; | 
|  | my $last_progress = \${$self->{LAST_PROGRESS}}; | 
|  |  | 
|  | my $prefix = ""; | 
|  | my $suffix = ""; | 
|  | if($$last_progress) { | 
|  | for (1..length($$last_progress)) { | 
|  | $prefix .= ""; | 
|  | } | 
|  |  | 
|  | my $diff = length($$last_progress)-length($$progress); | 
|  | if($diff > 0) { | 
|  | for (1..$diff) { | 
|  | $suffix .= " "; | 
|  | } | 
|  | for (1..$diff) { | 
|  | $suffix .= ""; | 
|  | } | 
|  | } | 
|  | } | 
|  | print STDERR $prefix . $$progress . $suffix; | 
|  | $$last_progress = $$progress; | 
|  | } | 
|  |  | 
|  | sub progress { | 
|  | my $self = shift; | 
|  | my $progress = \${$self->{PROGRESS}}; | 
|  |  | 
|  | $$progress = shift; | 
|  |  | 
|  | $self->update_progress; | 
|  | } | 
|  |  | 
|  | sub prefix { | 
|  | my $self = shift; | 
|  | my $prefix = \${$self->{PREFIX}}; | 
|  |  | 
|  | $$prefix = shift; | 
|  | } | 
|  |  | 
|  | sub write { | 
|  | my $self = shift; | 
|  |  | 
|  | my $message = shift; | 
|  |  | 
|  | my $prefix = \${$self->{PREFIX}}; | 
|  |  | 
|  | $self->hide_progress; | 
|  | print $$prefix . $message; | 
|  | $self->show_progress; | 
|  | } | 
|  |  | 
|  | 1; |