#!/usr/bin/perl
use warnings;
use strict;
use Test::More;
use Service::Factory;
my $xml = Service::Factory->instantiate('xml', 'xmldata');
$xml->populate;
like $xml->{template}, qr{xmldata}, 'XML OK';
my $json = Service::Factory->instantiate('json', 'jsondata');
$json->populate;
like $json->{template}, qr/{"data":"jsondata"}/, 'JSON OK';
done_testing;
####
package Service::XML;
use warnings;
use strict;
use parent 'Service';
use XML::LibXML;
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
my $xml = 'XML::LibXML::Document'->new;
$xml->setDocumentElement($xml->createElement('data'));
$xml->documentElement->appendTextNode('[data]');
$self->{template} = $xml->toString;
return $self
}
__PACKAGE__
####
package Service::Factory;
use Service::XML;
use Service::JSON;
use warnings;
use strict;
my %SUPPORTED = (
xml => 'XML',
json => 'JSON');
sub instantiate {
my ($class, $plugin) = @_;
die "Unknown plugin '$plugin'.\n" unless $SUPPORTED{$plugin};
my $subclass = "Service::$SUPPORTED{$plugin}";
return $subclass->new(@_[2 .. $#_])
}
__PACKAGE__
####
package Service::JSON;
use warnings;
use strict;
use parent 'Service';
use Cpanel::JSON::XS qw{ encode_json };
sub new {
my $class = shift;
my $self = $class->SUPER::new(@_);
$self->{template} = encode_json({data => '[data]'});
return $self
}
__PACKAGE__
####
package Service;
use warnings;
use strict;
sub new {
my ($class, $data) = @_;
return bless {
data => $data,
service => $class,
}, $class
}
sub populate {
my $self = shift;
$self->{template} =~ s/\[data\]/$self->{data}/i;
}
__PACKAGE__