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
mose...@hank.org

Reply via email to