# Copyright © 2010 Raphaël Hertzog <hertzog@debian.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

package Dpkg::Interface::Storable;

use strict;
use warnings;

our $VERSION = "1.00";

use Dpkg::Gettext;
use Dpkg::ErrorHandling;
use Dpkg::Compression::FileHandle;

use overload
    '""' => \&_stringify,
    'fallback' => 1;

=encoding utf8

=head1 NAME

Dpkg::Interface::Storable - common methods related to object serialization

=head1 DESCRIPTION

Dpkg::Interface::Storable is only meant to be used as parent
class for other objects. It provides common methods that are
all implemented on top of two basic methods parse() and output().

=head1 BASE METHODS

Those methods must be provided by the object that wish to inherit
from Dpkg::Interface::Storable so that the methods provided can work.

=over 4

=item $obj->parse($fh, $desc)

This methods initialize the object with the data stored in the
filehandle. $desc is optional and is a textual description of
the filehandle used in error messages.

=item $string = $obj->output($fh)

This method returns a string representation of the object in $string
and it writes the same string to $fh (if it's defined).

=back

=head1 PROVIDED METHODS

=over 4

=item $obj->load($filename)

Initialize the object with the data stored in the file. The file can be
compressed, it will be uncompressed on the fly by using a
Dpkg::Compression::FileHandle object. If $filename is "-", then the
standard input is read (no compression is allowed in that case).

=cut

sub load {
    my ($self, $file, @options) = @_;
    unless ($self->can("parse")) {
	internerr("%s cannot be loaded, it lacks the parse method", ref($self));
    }
    my ($desc, $fh) = ($file, undef);
    if ($file eq "-") {
	$fh = \*STDIN;
	$desc = _g("<standard input>");
    } else {
	$fh = Dpkg::Compression::FileHandle->new();
	open($fh, "<", $file) || syserr(_g("cannot read %s"), $file);
    }
    my $res = $self->parse($fh, $desc, @options);
    if ($file ne "-") {
	close($fh) || syserr(_g("cannot close %s"), $file);
    }
    return $res;
}

=item $obj->save($filename)

Store the object in the file. If the filename ends with a known
compression extension, it will be compressed on the fly by using a
Dpkg::Compression::FileHandle object. If $filename is "-", then the
standard output is used (data are written uncompressed in that case).

=cut

sub save {
    my ($self, $file, @options) = @_;
    unless ($self->can("output")) {
	internerr("%s cannot be saved, it lacks the output method", ref($self));
    }
    my $fh;
    if ($file eq "-") {
	$fh = \*STDOUT;
    } else {
	$fh = Dpkg::Compression::FileHandle->new();
	open($fh, ">", $file) || syserr(_g("cannot write %s"), $file);
    }
    $self->output($fh, @options);
    if ($file ne "-") {
	close($fh) || syserr(_g("cannot close %s"), $file);
    }
}

=item "$obj"

Return a string representation of the object.

=cut

sub _stringify {
    my ($self) = @_;
    unless ($self->can("output")) {
	internerr("%s cannot be stringified, it lacks the output method", ref($self));
    }
    return $self->output();
}

=back

=head1 AUTHOR

Raphaël Hertzog <hertzog@debian.org>.

=cut

1;
