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 >