[cgiapp] RunmodeDeclare and ValidateRM incompatibility?

Rhesa Rozendaal perl at rhesa.com
Wed Jun 17 21:28:43 EDT 2009


Ron Savage wrote:
> Hi Folks
> 
> On Thu, 2009-06-18 at 01:00 +0200, Rhesa Rozendaal wrote:
>> Richard Jones wrote:
>>> Richard Jones wrote:
>>>
> 
> [snip scary code]
> 
>> The hashref goes into the first var, because it's being passed in 
>> positionally. The fourth variable gets the id from the query, because it's 
>> named $"id" in the signature. It's still a normal method call, so 
>> $self->edit(1,2,3,4) would result in $foo=1, $bar=2, $errs=3, $id=4. It's only 
>> when you don't supply arguments that the query param fallback comes into play.
>> Of course, with dfv you're going to see a mix of that, and that makes it a bit 
>> harder to figure out what's going on.
> 
> Surely this is a maintenance nightmare!
 >
> And what happens if someone else has to patch this sort of stuff?
> 
> Does the problem really lie with the adoption of RunmodeDeclare in the
> first place?

I don't think so ;)

> I'd suggest, Richard, you seriously consider ditching it, for the sake
> of sanity and simplicity, at least.

That's a little harsh, considering CAP::RD is my module :(

I'd rather suggest that if you use CAP::RD and CAP::ValidateRM together, then 
don't use a signature on your run modes, and fetch query params the old way. 
That way you don't mix up method arguments and query params.

So like this:

   runmode edit {
     my $errs = shift;
     my $id = $self->query->param('id');
     ...

This way, you still get run mode registration and $self for free.

Or only declare positional arguments:

   runmode edit ($errs) {
     my $id = $self->query->param('id');
     ...

I tend to only use the signature for query params when I only expect one or 
two form variable anyway.

> But keep CGI::Application::Dispatch. You're on a winner there.

Definitely.



More information about the cgiapp mailing list