Hi Clayton,

I took a brief look at your code.  I think I know the solution to one of
your issues, namely: * I have to apply a trait to every attribute in the
class to get it to
participate.

I think that you can get the meta-attribute applied to all attributes
through Moose::Util::MetaRole::apply_metaroles.  In DependsOnA, try:

Moose::Util::MetaRole::apply_metaroles(
   for => $options{for_class},
   class_metaroles => {
        attribute => ['MooseX::DependsOnA::Attribute']
   }
)

This should make the 'depends_on' meta-attribute available to every class
without having to specify 'traits => [ ... ]'

Chris

Christopher Brown
Open Data
 http://www.opendatagroup.com
 http://opendatagroup.com/category/blog


On Mon, May 10, 2010 at 7:51 AM, Clayton Scott <clayton.sc...@gmail.com>wrote:

> In our classes we have a pattern where we create an attribute to
> represent a calculated value (calculated by a builder method).
> For various reasons we want to cache the calculated value in an
> attribute and then clear the attribute when an underlying attribute
> changes.
>
> I asked this question a while ago on Stackoverflow and I'm now trying
> to implement one of the suggestions, a role to do all of the dirty
> work for me.
>
>
> http://stackoverflow.com/questions/1775572/moose-expiring-cached-results-of-calculations-when-attribute-values-change/1780681#1780681
>
> So in a nut shell I want this behaviour:
>
> package main;
>
> use strict;
> use warnings;
> my $f = XX::Foobar->new( bar => '10' );
>
> print $f->calc(), "\n"; # calc attribute now populated with value of
> do_calc
>
> $f->clear_bar(); # bar and calc should be cleared
> $f->calc(), "\n"; # calc attribute now populated with value of do_calc
>
> $f->bar(2);        # calc attribute
> $f->calc(), "\n"; # Calc slot now populated with value of do_calc
>
> package XX::Foobar;
> use lib './lib';
> use Moose;
>
> use MooseX::DependsOnA; # My temp name for my Role/MooseXtension
>
> has bar => ( isa     => 'Num', clearer => 'clear_bar' );
>
> has calc => (
>    depends_on => ['bar'], # provided by Role if bar is ever changed
> call clear_value on this attribute
>    is         => 'rw',
>    isa        => 'Num',
>    lazy       => 1,
>    builder    => 'do_calc'
> );
>
> sub do_calc {
>   my ($self) = @_;
>   return  3.14 * $self->bar;
> }
>
>
> I have a MooseX:: package that almost does this but has the following
> issues:
> * doesn't clear dependent attributes on 'clear_$attr' only on 'set'
> * heavily cribbed from other MooseX:: modules
> * I have to apply a trait to every attribute in the class to get it to
> participate
>
> Here is the code for MooseX::DependsOnA: http://gist.github.com/396125
>
> All of this code is cribbed together from various sources and I'm sure
> that it's all crap.
> What am I missing?
>
> Thanks,
> Clayton
>

Reply via email to