/usr/local/CPAN/hub-standard/Hub/Parse/DataExtractor.pm
package Hub::Parse::DataExtractor;
use strict;
use Hub qw/:lib/;
push our @ISA, qw(Hub::Parse::Parser);
our %EVALUATORS;
sub get_evaluator {
my $evaluator = defined $EVALUATORS{$_[1]}
? $EVALUATORS{$_[1]}
: &Hub::Parse::Parser::get_evaluator(@_);
# Avoid undefined parser directive warnings
return defined $evaluator ? $evaluator : sub {};
}
$EVALUATORS{'define'} = sub {
my ($self, $params, $result) = @_;
my ($outer_str, $fields, $pos, $text, $parents, $valdata) = @$params;
my ($opts, %directive) = Hub::hashopts($fields);
my $varname = $directive{'define'};
my ($end_p, $block) =
$self->_get_block($$pos + length($outer_str), $text, 'define');
$$result{'width'} = $end_p - $$pos;
$directive{'as'} = 'HASH' unless defined $directive{'as'};
my $data = ();
if ($directive{'as'} =~ /^(DATA|HASH)$/i) {
if (defined $varname) {
$self->{'data'}{$varname} ||= mkinst('SortedHash');
Hub::hparse($block, -into => $self->{'data'}{$varname});
} else {
Hub::hparse($block, -into => $self->{'data'});
}
} elsif ($directive{'as'} =~ /^(LIST|ARRAY)$/i) {
if (defined $varname) {
$self->{'data'}{$varname} ||= [];
die "Cannot parse array data into: $self->{'data'}{$varname}"
unless isa($self->{'data'}{$varname}, 'ARRAY');
Hub::hparse($block, -into => $self->{'data'}{$varname});
} else {
die "Cannot use root element as: $directive{'as'}\n";
}
} elsif ($directive{'as'} =~ /^(TEXT|SCALAR)$/i) {
if (defined $varname) {
$self->{'data'}{$varname} = $block;
} else {
die "Cannot use root element as: $directive{'as'}\n";
}
}
};
sub get_value {
return '';
}
# ------------------------------------------------------------------------------
# get_data - Return extracted data
# ------------------------------------------------------------------------------
sub get_data {
my ($self,$opts) = Hub::objopts(\@_);
$$self{'data'} ||= {};
$self->populate();
return $$self{'data'};
}#get_data
1;