package PDF::FromHTML::Template::Factory;
use strict;
BEGIN {
use vars qw(%Manifest %isBuildable);
}
%Manifest = (
# These are the instantiable nodes
'ALWAYS' => 'PDF::FromHTML::Template::Container::Always',
'CONDITIONAL' => 'PDF::FromHTML::Template::Container::Conditional',
'FONT' => 'PDF::FromHTML::Template::Container::Font',
'IF' => 'PDF::FromHTML::Template::Container::Conditional',
'LOOP' => 'PDF::FromHTML::Template::Container::Loop',
'PAGEDEF' => 'PDF::FromHTML::Template::Container::PageDef',
'PDFTEMPLATE' => 'PDF::FromHTML::Template::Container::PdfTemplate',
'ROW' => 'PDF::FromHTML::Template::Container::Row',
'SCOPE' => 'PDF::FromHTML::Template::Container::Scope',
'SECTION' => 'PDF::FromHTML::Template::Container::Section',
'HEADER' => 'PDF::FromHTML::Template::Container::Header',
'FOOTER' => 'PDF::FromHTML::Template::Container::Footer',
'BOOKMARK' => 'PDF::FromHTML::Template::Element::Bookmark',
'CIRCLE' => 'PDF::FromHTML::Template::Element::Circle',
'HR' => 'PDF::FromHTML::Template::Element::HorizontalRule',
'IMAGE' => 'PDF::FromHTML::Template::Element::Image',
'PAGEBREAK' => 'PDF::FromHTML::Template::Element::PageBreak',
'LINE' => 'PDF::FromHTML::Template::Element::Line',
'TEXTBOX' => 'PDF::FromHTML::Template::Element::TextBox',
'VAR' => 'PDF::FromHTML::Template::Element::Var',
'WEBLINK' => 'PDF::FromHTML::Template::Element::Weblink',
# These are the helper objects
'TEXTOBJECT' => 'PDF::FromHTML::Template::TextObject',
'CONTEXT' => 'PDF::FromHTML::Template::Context',
'ITERATOR' => 'PDF::FromHTML::Template::Iterator',
'MARGIN' => 'PDF::FromHTML::Template::Container::Margin',
'CONTAINER' => 'PDF::FromHTML::Template::Container',
'ELEMENT' => 'PDF::FromHTML::Template::Element',
'BASE' => 'PDF::FromHTML::Template::Base',
);
%isBuildable = map { $_ => 1 } qw(
ALWAYS
BOOKMARK
CIRCLE
CONDITIONAL
FONT
FOOTER
HEADER
HR
IF
IMAGE
LINE
LOOP
PAGEBREAK
PAGEDEF
PDFTEMPLATE
ROW
SCOPE
SECTION
TEXTBOX
VAR
WEBLINK
);
sub register
{
my %params = @_;
my @param_names = qw(name class isa);
for (@param_names)
{
unless ($params{$_})
{
warn "$_ was not supplied to register()\n";
return 0;
}
}
my $name = uc $params{name};
if (exists $Manifest{$name})
{
warn "$params{name} already exists in the manifest.\n";
return 0;
}
my $isa = uc $params{isa};
unless (exists $Manifest{$isa})
{
warn "$params{isa} does not exist in the manifest.\n";
return 0;
}
$Manifest{$name} = $params{class};
$isBuildable{$name} = 1;
{
no strict 'refs';
unshift @{"$params{class}::ISA"}, $Manifest{$isa};
}
return 1;
}
sub create
{
my $class = shift;
my $name = uc shift;
return unless exists $Manifest{$name};
(my $filename = $Manifest{$name}) =~ s!::!/!g;
eval {
require "$filename.pm";
}; if ($@) {
die "Cannot find or compile PM file for '$name' ($filename)\n";
}
return $Manifest{$name}->new(@_);
}
sub create_node
{
my $class = shift;
my $name = uc shift;
return unless exists $isBuildable{$name};
return $class->create($name, @_);
}
sub isa
{
return UNIVERSAL::isa($_[0], $Manifest{uc $_[1]})
if @_ >= 2 && exists $Manifest{uc $_[1]};
UNIVERSAL::isa(@_)
}
1;
__END__