Re: "automatically" wrapping methods.

[email protected] (Peter Shangov)
Newsgroups perl.moose
Message-ID <[email protected]>
Or you can use B::Hooks::EndOfScope to do the wrapping at the end of the compilation stage:

# untested code
package MooseX::MethodValidation;
use B::Hooks::EndOfScope;
sub import {
  on_scope_end {
    my $caller = caller;
    my $meta = Moose::Meta::Class->initialize($caller);
    foreach my $method ( $meta->get_all_methods )  {
      ... # wrapping code goes here
    }
  }
}

package MyModel::User;
use MooseX::MethodValidation;
... # your subs go here

Cheers,

--
Peter



>________________________________
> From: Chris Weyl <[email protected]>
>To: [email protected] 
>Cc: Bill Moseley <[email protected]>; moose <[email protected]> 
>Sent: Monday, 9 January 2012, 20:26
>Subject: Re: "automatically" wrapping methods.
> 
>Parameterized roles are nifty (and I've probably used them more than is
>good for my health), but in this scenario a more elegant approach (IMHO)
>would be to create a trait to be applied to the method metaclass that will
>do the validation you need, and syntactic sugar (see Moose::Exporter) to
>handle the work of it.  Ideally you'd end up with something like:
>
>    use Moose;
>    use MooseX::MethodValidation;
>
>    validated_method foo => sub { ... };
>
>validated_method() being the sugar that will take the class metaclass,
>method name, and method body; then create/apply the method using the
>trait'ed method metaclass.  You may need to do a little experimenting to
>see what works best here vis-a-vis how much to do in the sugar and how much
>to do in the trait.
>
>This approach has the advantage that you can easily create validated
>methods in the same manner as method modifiers (around, before, etc), and
>you can also easily determine which methods are validated by checking their
>metaclasses to see if they do the validation trait.  It also tends to make
>it pretty obvious about what's going on (not how, but what) with a minimum
>of fuss.
>
>                                 -Chris
>
>On Sun, Jan 8, 2012 at 11:57 PM, <[email protected]> wrote:
>
>> 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]
>>
>
>
>
>-- 
>Chris Weyl
>Ex astris scientia
>
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.