#!/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__