The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
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;