Returning objects of different types based on arguments... this sounds like the Factory design pattern.
Update: An example added. It doesn't make much sense, as I'm not sure what your classes do and how they differ. Instead of having the same ancestor (Website), they could share a role instead.
#!/usr/bin/perl
use warnings;
use strict;
{ package Website::Factory;
use Moose;
sub build {
my ($self, %args) = @_;
my $type = delete $args{type};
my $class;
die "Unknown type '$type'.\n" unless $class = {
'drupal' => 'Website::Drupal',
'wordpress' => 'Website::WordPress',
}->{$type};
return $class->new(%args)
}
}
{ package Website;
use Moose;
has path => ( is => 'ro',
isa => 'Str' );
}
{ package Website::Drupal;
use Moose;
extends 'Website';
}
{ package Website::WordPress;
use Moose;
extends 'Website';
}
my $wf = 'Website::Factory'->new;
my $drupal = $wf->build( type => 'drupal',
path => '/index.php' );
use Data::Dumper;
print Dumper($drupal);
Advantages: you can now add a new type easily. You can (to some extent) change the implementation of the Website classes without need to change the code that creates their instances.
($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord
}map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,