Frustrated Moose

Well leaving off from my last post I was a little frustrated with Moose but not as much as our Moose friend below.

frustrated_moose.jpg

So after a good night of sleep and a large pot of coffee I stumbled on a Moose solution.

Seems some-one else must of had the same problem, some time before my entry into the Moose space, and a quick search of the MooseX namespace and I found 'MooseX::Role::BuildInstanceOf'* which looked to be what I wanted. So here we go

Well in my creator class I started from scratch again with


package RPG::ADD::Creator;
use Moose;
with 'MooseX::Role::BuildInstanceOf' => {
target => 'RPG::ADD::Creator::Strength',
prefix => 'Strength',
constructor => 'new',
inherited_args => [{roll=>'strength'}],};

and in the ability area I added in my delegation like this


has 'strength' =>(
        is           =>'rw',
        isa         =>'AbilityRoll',
);

And in my 'Strength' class I do this


package RPG::ADD::Creator::Strength;
use Moose;
has 'roll' =>(
is =>'rw',
);

So then when I give this a try

my $str = RPG::ADD::Creator->new({strength=>9,
dexterity=>3,
constitution=>3,
charisma=>3,
intelligence=>3,
wisdom=>3,
});

print "strength=".$str->strength()."\n";


I get this

strength=9

and as a bonus the 'AbilityRoll' type still works


Attribute (strength) does not pass the type constraint because: AbilityRoll must be between '3' and '18' not '2' at ...

So what did I do here? Well with my 'BuildInstanceOf'' I created an instance of a my 'Strength' class in my present class that I can access with 'Strength' and I was even able to pass to it my value for 'roll' into may class.

* Just as a side note. I had to add a little patch to this mod to stop 'Class::MOP::load_class deprecation warnings'.

Leave a comment

About byterock

user-pic Long time Perl guy, a few CPAN mods allot of work on DBD::Oracle and a few YAPC presentations