=head1 NAME Data::Downloader::Utils; =head1 DESCRIPTION Miscellaneous exportable functions. =head1 FUNCTIONS =over =cut package Data::Downloader::Utils; use Sub::Exporter -setup => { exports => [ qw/human_size do_system_call ERRORDIE WARNDIE/ ] }; use Log::Log4perl qw/:easy/; use strict; =item human_size Given a number of bytes, return a human-readable string (like du(1)) =cut sub human_size { my $val = shift; my @units = qw/B K M G T P/; my $unit = shift @units; do { $unit = shift @units; $val /= 1000; } until $val < 1000 || !@units; return sprintf( "%.1f%s", $val, $unit ); } =item do_system_call Test commands without invoking system calls. Returns 1 on success, dies on failure. =cut sub do_system_call { # Hook for test scripts. if ($ENV{TEST_SYSTEM_STUB} && $ENV{HARNESS_ACTIVE}) { my $cmd = \& { $ENV{TEST_SYSTEM_STUB} }; return &$cmd(@_); } else { system(@_) == 0 or do { ERROR "command: @_ failed : $? ".(${^CHILD_ERROR_NATIVE} || ''); return; }; } return 1; } =item WARNDIE Logs an WARN message and then dies. =cut sub WARNDIE { WARN @_; die; } =item ERRORDIE Logs an ERROR and then dies. =cut sub ERRORDIE { ERROR @_; die; } =back =head1 SEE ALSO Sub::Exporter =cut 1;