package Text::Decorator::Group;
use strict;
use warnings;
use Carp;
=head1 NAME
Text::Decorator::Group - A (possibly nested) group of nodes
=head1 SYNOPSIS
my $group = $self->new(@nodes);
$self->format_as('html');
$self->nodes
=head1 DESCRIPTION
A Group is a set of nodes that live together for some semantic reason -
paragraphs in a document, sentences in a paragraph, or whatever.
=head1 METHODS
=head2 new
$self->new(@nodes);
Creates a new Text::Decorator::Group instance.
=cut
sub new {
my $class = shift;
return bless {
nodes => [@_],
representations => {},
notes => {}, # What's this group all about, then?
} => $class;
}
=head2 nodes
@nodes = $self->nodes;
Returns the nodes which make up this group.
=cut
sub nodes { return @{ shift->{nodes} } }
=head2 format_as
$self->format_as("html")
Descend into the group, formatting each node, stringing the pieces
together and returning the result, optionally adding some pre- and post-
representation-specific material.
=cut
sub format_as {
my ($self, $format) = @_;
my $gformat = $format;
$gformat = "text" if not exists $self->{representations}{$format};
no warnings;
return $self->{representations}{$gformat}{pre}
. join(
$self->{representations}{$gformat}{inter},
map $_->format_as($format),
$self->nodes
)
. $self->{representations}{$gformat}{post};
}
1;