I'd look to moving this logic into a parameterised role, with the parameters being the methods you are looking at validating. Have a look at MooseX::Role::Parameterized for details on how to do this.
Take care, Mark. On 9 Jan 2012, at 05:14, Bill Moseley <[email protected]> wrote: > I have have a number of classes that include methods that need input > validation. I use a validation class for each method which means > validation is called the same way every time its used. That is, I have a > common pattern I'm using on a number of methods and wondering if anyone can > suggest a more clever approach so I don't end up repeating similar code. > > A code example might make it clearer: > > package MyModel::User; > use Moose; > extends 'MyModel::Base'; > > > # This method is called by the consumer to create a new user, > # and the $user_data passed here is assumed to have been validated. > > sub new_user { > my ( $self, $user_data ) = @_; > > return $self->ORM_layer( 'User' )->create( $user_data ); > } > > > # Here's the code that gets repeated for every method that requires > validation. > > around new_user => sub { > my ( $orig, $self, $args ) = @_; > > # Fetch validation instance for > my $validation_class = $self->validation_class_for_method( 'new_user' ); > my $validation_instance = $validation_class->new( $args ); > > # Throw exception object with validation failures unless data passes > validation. > $validation_instance->thow_exception unless > $validation_instance->validates_ok; > > return; > }; > > > So, I'm looking for a suggestion how to avoid the explicit wrapper. One > option I was considering was something Catalyst-like with subroutine > attributes: > > sub new_user : Validate { > ... > } > > Then all methods with the "Validate" attribute would automatically get > wrapped, although I'm not clear if that's the best approach or even its > implementation. > > Thanks, > > > > > > -- > Bill Moseley > [email protected]
