Hello Andrew,

you write:

> Apologies if this is a dumb question, but I have repeatedly tried to
> understand this section of the documentation, and I need some help:
>
> http://search.cpan.org/~ether/Moose-2.1404/lib/Moose/Manual/Attributes.
> pod#Accessor_methods
>
> I want to create a class that has some attributes. However, there’s
> some logic that needs to be executed when setting values on these
> attributes. In some cases, I’ll need to throw an error like “you can’t
> set that value on this object attribute”, I also need to be able to
> modify the value on the way into the object sort of like a DECODE()
> statement in SQL, etc.

You'll want to scroll half a dozen screenfuls downward on the same page
and check out the section titled "Triggers".  These can be used to do
exactly the things you want.

Setting writer / reader, on the other hand, is just providing names to
the accessor routines which Moose creates automatically for you.

> This seems like I’d just need to declare a writer sub for the
> attribute, do my logic in there, then set the attribute value or throw
> an error, right?
>
> Why doesn't this work?
>
>     package Bogus {
>     use Moose;
>     has ‘value’, is => “rw”, writer => “_value”, isa => “Num”;

make that trigger => "_value"

>     sub _value {
>     my ($self, $value) = @_;

...you'll get ($self,$value,$previous_value) = @_;

>     ## insert some logic here

Your logic can check and modify $current_value, and if changed, pass it
to the writer (again), or even reinstate the previous value.

>     $self->value($value);
>     return(1);
>     }
>     }
>     
>     
>     use Bogus;
>     my $a = new Bogus(value => 1);
>
> Can what I’m trying to do even be done in Moose?
> again, sorry for the dumb question. I’m quite sure I’ve just missed
> something in my understanding.

I'm also a Moose beginner (more or less) and know this feeling very
well.  There's a lot of stuff to read, and I was lucky to have a gentle
introduction at our Perl monger's meeting.

I have never tried the more sophisticated methods to achieve your goal:
declare how to check your value as described in
`perldoc Moose::Manual::Types`: type constraints can valuate the input
against the properties of a custom class, and coercion can modify the
value on the fly.
--
Cheers,
haj

Reply via email to