#!/usr/bin/perl use strict; use warnings; package HTML::Widget::NavEntry; use Moose; has 'title' => ( is => 'rw' ); has 'link' => ( is => 'rw' ); sub to_html { my $self = shift; return "\t" . '' . $self->title . '' . "\n"; } package HTML::Widget::SubNavigation; use Moose; has 'title' => ( is => 'rw', required => 1 ); has 'entries' => ( isa => 'ArrayRef', is => 'rw', default => sub { return [] } ); sub to_html { my $self = shift; my $o = '' . "\n"; return $o; } sub add_entry { my $self = shift; my $entry = shift; return unless blessed $entry eq 'HTML::Widget::NavEntry'; push @{$self->entries}, $entry; } package HTML::Widget::Navigation; use Moose; has 'entries' => ( isa => 'ArrayRef', is => 'rw', default => sub { return [] } ); sub to_html { my $self = shift; my $o = '' . "\n" x 2; return $o; } sub selected_to_html { my $self = shift; my $selection = shift; my $o = '' . "\n" x 2; return $o; } sub add_entry { my $self = shift; my $entry = shift; return unless ( blessed $entry eq 'HTML::Widget::NavEntry' or blessed $entry eq 'HTML::Widget::SubNavigation' ); push @{$self->entries}, $entry; } package main; my $s_nav1 = HTML::Widget::SubNavigation->new( title => 'foo' ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'foo', link => 'foo.pl' ) ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'bar', link => 'foo.pl?content=bar' ) ); $s_nav1->add_entry( HTML::Widget::NavEntry->new( title => 'buz', link => 'buz.pl' ) ); my $s_nav2 = HTML::Widget::SubNavigation->new( title => 'yankee' ); $s_nav2->add_entry( HTML::Widget::NavEntry->new( title => 'yankee', link => 'yankee.pl' ) ); $s_nav2->add_entry( HTML::Widget::NavEntry->new( title => 'zulu', link => 'zulu.pl' ) ); my $nav = HTML::Widget::Navigation->new; $nav->add_entry( $s_nav1 ); $nav->add_entry( $s_nav2 ); print $nav->to_html; print $nav->selected_to_html('foo');