#-*- Mode: CPerl -*-

## File: DDC::Format.pm
## Author: Bryan Jurish <moocow@cpan.org>
## Description:
##  + DDC Query utilities: output formatting
##======================================================================

package DDC::Format;
use IO::File;
use Carp;
use strict;

##======================================================================
## Globals

##======================================================================
## Constructors, etc.

## $fmt = $CLASS_OR_OBJ->new(%args)
##  + %args:
sub new {
  my $that = shift;
  return bless { @_ }, ref($that)||$that;
}

## $fmt = $fmt->reset()
##  + reset counters, etc.
sub reset { return $_[0]; }

##======================================================================
## API

## $str = $fmt->toString($hitList)
sub toString {
  my ($fmt,$hits) = @_;
  return "$hits";
}

## undef = $fmt->toFile($hitList,$file)
##  + default implementation calls $fmt->toFh()
sub toFile {
  my ($fmt,$hits,$file) = @_;
  my $fh = ref($file) ? $file : IO::File->new(">$file");
  confess(ref($fmt)."::toFile(): open failed for '$file': $!") if (!$fh);
  my $rc = $fmt->toFh($hits,$fh);
  $fh->close() if (!ref($file));
  return $rc;
}

## undef = $fmt->toFh($hitList,$fh)
##  + default implementation calls $fmt->toString()
sub toFh {
  my ($fmt,$hits,$fh) = @_;
  $fh->print($fmt->toString($hits));
}


1; ##-- be happy

__END__

##======================================================================
## Docs
=pod

=head1 NAME

DDC::Format - Abstract output formatting API for DDC hits

=head1 SYNOPSIS

 use DDC::Concordance;

 $hitList = DDC::Client::Distributed->new()->query('foo&&bar'); ##-- get some hits

 $fmt  = DDC::Format->new(%some_args); ##-- new format
 $str = $fmt->toString($hitList);      ##-- conversion to string
 $fmt->toFile($hitList,$filename);     ##-- output to file
 $fmt->toFh($hitList,$fh);             ##-- output to filehandle

=cut

##======================================================================
## Description
=pod

=head1 DESCRIPTION

Abstract class for hit formatting.

=cut

##========================================================================
## POD DOCUMENTATION, auto-generated by podextract.perl

##----------------------------------------------------------------
## DESCRIPTION: DDC::Format: Constructors, etc.
=pod

=head2 Constructors, etc.

=over 4

=item new

 $fmt = $CLASS_OR_OBJ->new(%args);

Derived classes may accept keyword arguments in %args.
The abstract implementation interprets them as literal keys in
the underlying object structure (a HASH-ref).


=item reset

 $fmt = $fmt->reset();

Reset counters, etc.

=back

=cut

##----------------------------------------------------------------
## DESCRIPTION: DDC::Format: API
=pod

=head2 API

=over 4

=item toString

 $str = $fmt->toString($hitList);

Should format a L<DDC::HitList|DDC::HitList> object C<$hitList> to
a string representation.

Dummy implementation.

=item toFile

 undef = $fmt->toFile($hitList,$file);

Should format a L<DDC::HitList|DDC::HitList> object C<$hitList> to
a named file C<$file>.

Default implementation calls L<$fmt-E<gt>toFh()|/toFh>.


=item toFh

 undef = $fmt->toFh($hitList,$fh);

Should format a L<DDC::HitList|DDC::HitList> object C<$hitList> to
a filehandle C<$fh> opened for output.

Default implementation calls L<$fmt-E<gt>toString()|/toString>.

=back

=cut

##========================================================================
## END POD DOCUMENTATION, auto-generated by podextract.perl


##======================================================================
## Footer
##======================================================================
=pod

=head1 AUTHOR

Bryan Jurish E<lt>moocow@cpan.orgE<gt>

=head1 COPYRIGHT AND LICENSE

Copyright (C) 2006-2016 by Bryan Jurish

This package is free software; you can redistribute it and/or modify
it under the same terms as Perl itself, either Perl version 5.14.2 or,
at your option, any later version of Perl 5 you may have available.

=cut