http://www.perlmonks.org?node_id=1011683

celogeek has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I want to create a role that will be a based for validators. In my 'CreativesValidator' I have this method :
#only there for the validator below which do stuff after build. sub BUILD {} has '_creative_validators' => ( is => 'ro', default => sub { [] }, ); sub register_validator { my ($class, $sub) = @_; $class->can('after')->(BUILD => sub { my ($self) = @_; push @{$self->_creative_validators}, $sub; }); }
So here a validator : (ForcedPause)
use Moo::Role; with 'Weborama::Collect::CreativesValidator'; #you have to define that one requires qw/creatives_validator_publisher_forced_pause_settings/; __PACKAGE__->register_validator(sub { my ( $self, @creatives ) = @_; ... })
is they a cleaner way to do that ? I really want to avoir the copy paste of the register_validator method everywhere. I will have 50 filters or more.

Replies are listed 'Best First'.
Re: The best Moo::Role way to do an alias to 'after BUILD'
by tobyink (Canon) on Jan 04, 2013 at 20:57 UTC

    Maybe something like...

    { package Weborama::Collect::CreativesValidator; use Moo::Role; use MooX::ClassAttribute; class_has _registered_validators => ( is => 'ro', default => sub { [] }, ); has _creative_validators => ( is => 'ro', default => sub { [] }, ); sub register_validator { my $class = shift; push @{$class->_registered_validators}, @_; } after BUILD => sub { my $self = shift; my $class = ref $self; push @{$self->_creative_validators}, @{$class->_registered_validat +ors}; }; } { package Weborama::ForcedPause; use Moo::Role; with 'Weborama::Collect::CreativesValidator'; # you have to define that one requires qw/creatives_validator_publisher_forced_pause_settings/; __PACKAGE__->register_validator(sub { my ( $self, @creatives ) = @_; ... }); }
    perl -E'sub Monkey::do{say$_,for@_,do{($monkey=[caller(0)]->[3])=~s{::}{ }and$monkey}}"Monkey say"->Monkey::do'