On Sun, Apr 19, 2009 at 4:31 PM, Chris Prather <[email protected]> wrote:
> Sorry I've been really busy all weekend and not at a computer. Your
> problem is what people in other situations call a Factory Pattern with
> a minor variation. I meant to write a while ago (like I said busy) a
> suggestion of something like:
>
> [...] snip
Gah, I posted saying exactly this, but forgot to use reply all >.<
Anyway, here's what I wrote:
What you're trying to achieve here is usually done by using the
factory design pattern. I would do it something like:
--
package Test::V1;
use Moose;
has 'foo' => ( is => 'rw', default => 1 );
package Test::V2;
use Moose;
has 'foo' => ( is => 'rw', default => 2 );
has 'bar' => ( is => 'rw' );
package Test;
use MooseX::Singleton;
has 'registered_classes' => (
isa => 'HashRef',
is => 'rw',
# I wouldn't suggest using builder, but rather
# MooseX::AttributeHelpers and adding methods like
# "register_class"
builder => '_default_classes'
);
sub _default_classes {
return {
1 => "Test::V1",
2 => "Test::V2"
}
}
sub create {
my ($self, $ver, @args) = @_;
my $class = $self->registered_classes->{$ver}
or return;
return $class->new(@args);
}
use Test;
my $foo = Test->create(1);
my $foo2 = Test->create(2, bar => 'yay');
printf "\$foo isa %s\n", $foo->meta->class->name;
printf "\$foo2 isa %s\n", $foo2->meta->class->name;
---
Untested code, but hopefully you get the general idea.
--
Oliver Charles / aCiD2