App-Chart
view release on metacpan or search on metacpan
lib/App/Chart/LatestHandler.pm view on Meta::CPAN
my (@symbol_list, @extra_list);
{
# delete duplicates and any extra_list already in symbol_list
my %hash;
@symbol_list = grep {!$hash{$_}++} @$orig_symbol_list;
@extra_list = grep {!$hash{$_}++} @$orig_extra_list;
}
foreach my $symbol (@symbol_list, @extra_list) {
App::Chart::symbol_setups ($symbol);
}
while (@symbol_list) {
### LatestHandler considering: "@symbol_list"
my @this_list = (shift @symbol_list);
my $handler = $class->handler_for_symbol ($this_list[0]);
if (! $handler) {
print "No latest handler for \"",$this_list[0],"\"\n";
next;
}
my $pred = $handler->{'pred'};
my $max_symbols = $handler->{'max_symbols'} || 1_000_000;
foreach my $list (\@symbol_list, \@extra_list) {
for (my $i = 0; @this_list < $max_symbols && $i < @$list; ) {
my $symbol = $list->[$i];
if ($pred->match ($symbol)) {
push @this_list, $symbol;
splice @$list, $i,1;
} else {
$i++;
}
}
}
my $proc = $handler->{'proc'};
my $trace;
unless (do {
local $SIG{'__DIE__'} =
(# $App::Chart::option{'verbose'} &&
eval { require Devel::StackTrace; 1 }
? sub {
{ local $@; $trace = Devel::StackTrace->new; }
die $@;
}
: $SIG{'__DIE__'});
eval { $proc->(\@this_list); 1 };
}) {
my $err = $@;
unless (utf8::is_utf8($err)) { $err = Encode::decode('locale',$err); }
print "Latest download error: ", $err, "\n";
if (defined $trace) {
print $trace->as_string, "\n";
}
}
}
}
sub expand_arguments {
my ($args) = @_;
my @symbol_list = ();
foreach my $arg (@$args) {
if (ref $arg) {
push @symbol_list, $arg->symbols;
} else {
push @symbol_list, App::Chart::Download::symbol_glob ($arg);
}
}
return @symbol_list;
}
sub command_line_download {
my ($class, $args) = @_;
my @symbol_list = expand_arguments ($args);
$class->download (\@symbol_list, []);
}
1;
__END__
=for stopwords intraday undef
=head1 NAME
App::Chart::LatestHandler -- latest quotes download handler object
=head1 SYNOPSIS
use App::Chart::LatestHandler;
=head1 FUNCTIONS
=over 4
=item C<< App::Chart::LatestHandler->new (...) >>
Create and register a new intraday image handler. The return is a new
C<App::Chart::LatestHandler> object, though usually this is not of interest
(only all the handlers later with C<handlers_for_symbol> below).
my $pred = App::Chart::Sympred::Suffix->new ('.NZ');
App::Chart::LatestHandler->new
(pred => $pred,
proc => \&latest_download);
=item C<< App::Chart::LatestHandler->handler_for_symbol ($symbol) >>
Return the C<App::Chart::LatestHandler> object which handles C<$symbol>, or
return undef if none.
=item C<< App::Chart::LatestHandler->download ($symbol_list, $extra_list) >>
=back
( run in 1.090 second using v1.01-cache-2.11-cpan-5623c5533a1 )