Hi,
I'm new to Moose. I've been tinkering with a toy example to learn Moose. My
goal is
to make my Moose extension as syntactically elegant as possible.
The basic idea is to have a trait called "Cached" which has a timestamp, which
would
be checked and then cause invalidation. The Cached Trait would add a Timer
attribute
to the attribute, as well as an around method to the attribute reader, and a
manual
method (called "invalidate_my_cached_attribute").
I found using the MOP pretty self explanatory, but I did run into one problem.
I couldn't
find a way to hook everything in simply using a trait. I had to separate the
Trait defining
stuff (Cached Trait, timer) from the Exporter stuff (around method, add
invalidate method).
Here's how you currently need to use my trait:
use MyCachedAttributeUtil;
has 'my_cached_attribute' => (
isa => 'ArrayRef[MyClass]',
traits => ['Cached'],
is => 'ro',
lazy_build => 1,
init_arg => undef,
expire_seconds => 1,
);
cached 'my_cached_attribute';
It seems there should be a way to eliminate the first line and last line, and
have the trait
(Cached) do everything. But I couldn't get this to work.
There seem to be two issues:
1. The Cached Traits implementation is passed an anonymous class object, which
does not
give me access to the reader routine (in this case my_cached_attribute is
the default
reader). While I can get the name of the method, I wasn't actually able to
modify the
method by applying the "around" modifier. I solved this by putting the
around modifier
in the separate util module "MyCachedAttributeUtil", and adding it to the
class in the
call "cached 'my_cached_attribute'.
I think the problem was I needed to "go up one level", because the symbol I
needed
to modify ('my_cached_attribute'), would have not been at the attribute
level (the
implementation would have been, but the name of the method is possibly one
level up).
2. When I attempt to put both the Moose::Export stuff (from
MyCachedAttributeUtil) in
the same module as the Moose::Role stuff (Cached Trait), things are unhappy.
The exact error is that the new keyword "cached" which I export, doesn't
seem to
be recognized.
I'm sure there's a way to do this, I'm just missing a technique or two here.
Thanks,
Roger