/usr/local/CPAN/oEdtk/oEdtk/Doc.pm
package oEdtk::Doc;
use Scalar::Util qw(blessed);
our $VERSION = '0.01';
use overload '""' => \&dump;
# The maximum number of characters to output before inserting
# a newline character.
my $LINE_CUTOFF = 120;
sub new {
my ($class) = @_;
my $self = {};
bless $self, $class;
$self->reset();
return $self;
}
sub reset {
my ($self) = @_;
$self->{'taglist'} = [];
$self->{'emitted'} = 0;
}
sub append {
my ($self, $name, $value) = @_;
if (blessed($name) && $name->isa('oEdtk::Doc')) {
push(@{$self->{'taglist'}}, @{$name->{'taglist'}});
} elsif (ref($name) eq 'HASH') {
while (my ($key, $val) = each(%$name)) {
$self->append($key, $val);
}
} else {
my $tag = $self->mktag($name, $value);
push(@{$self->{'taglist'}}, $tag);
}
}
sub dump {
my ($self) = @_;
my $out = '';
foreach (@{$self->{'taglist'}}) {
my $tag = $_->emit;
my $taglen = length $tag;
if ($self->{'emitted'} + $taglen > $LINE_CUTOFF) {
$out .= $self->line_break();
$self->{'emitted'} = 0;
}
$self->{'emitted'} += $taglen;
$out .= $tag;
}
return $out;
}
# The two following methods should only be implemented by
# the subclasses (see C7Doc or TexDoc).
sub mktag {
die "ERROR: oEdtk::Doc::mktag unimplemented method";
}
sub append_table {
die "ERROR: oEdtk::Doc::append_table unimplemented method";
}
sub line_break {
die "ERROR: oEdtk::Doc::line_break unimplemented method";
}
1;