Beefy Boxes and Bandwidth Generously Provided by pair Networks
Your skill will accomplish
what the force of many cannot
 
PerlMonks  

Re^2: Ubiquity of the CGI param method

by jwark (Novice)
on Aug 11, 2010 at 12:29 UTC ( #854343=note: print w/ replies, xml ) Need Help??


in reply to Re: Ubiquity of the CGI param method
in thread Ubiquity of the CGI param method

Interesting. That appears to be pretty good for a quickie. That does look like it covers a lot of what I usually do with the param() method.

However (and this goes back to wanting an RFC type thing), the param method does more. I believe that you are able to set values (not too bad to implement) and I believe that you are supposed to be able to have multiple values (array refs) per parameter. Again, I don't believe that those would be too difficult to implement off of what you presented here, but I wonder what other features I am missing.

The Data::FormValidator (and I keep going back to that because it is the package that made me think about this) uses an object with a param method, but I don't know what features of the param method are used. Probably the most basic like you described above, but a complete param() method would be desirable.

Thank you (both) very much for your time. If you have any more ideas, I would appreciate them.


Comment on Re^2: Ubiquity of the CGI param method
Re^3: Ubiquity of the CGI param method
by jaldhar (Vicar) on Aug 12, 2010 at 06:30 UTC

    Allow me to throw my hat into the ring. I've tested this with Data::FormValidator and HTML::Template and it seems to work fine.

    package Object::WithParams; use warnings; use strict; use Carp qw/ croak /; =pod =head1 NAME Object::WithParams - An Object With Params =head1 VERSION Version 0.1 =cut our $VERSION = '0.1'; =head1 SYNOPSIS use Object::WithParams; my $thingy = Object::WithParams->new(); # set a param $thingy->param(veggie => 'tomato'); # get a param my $veggie = $thingy->param('veggie'); # $veggie eq 'tomato' # get all params my @params = $thingy->param(); # @params == ('veggie') # clone a Object::WithParams my $doodad = $thingy->clone; # $doodad->param('veggie') == 'tomato +' # delete a param $thingy->delete('veggie'); # delete all params $thingy->clear(); =head1 DESCRIPTION Use this module to create objects that do nothing except contain param +eters defined by you which you can get and set as you wish. Many modules su +ch as L<Data::FormValidator> have methods that accept an object with a param +() method and this object should be compatible with all of them. This module really ought to be a role but there is no standardized way + to do that in Perl 5. (Not everyone uses L<Moose>.) =head1 METHODS =head2 new Creates a new, empty L<Object::WithParams>. =cut sub new { my ($class) = @_; my $self = {}; return bless $self, $class; } =head2 clear Deletes all the extent parameters. Does not return anything. $thingy->clear(); =cut sub clear { my ($self) = @_; foreach my $param ( keys %{$self} ) { delete $self->{$param}; } return; } =head2 clone Returns a new L<Object::WithParams> with the same set of parameters as + the old one. my $doodad = $thingy->clone(); =cut sub clone { my ($self) = @_; my $clone = Object::WithParams->new(); foreach my $param ( $self->param() ) { $clone->param( $param => $self->param($param) ); } return $clone; } =head2 delete Delete the named parameter. $thingy->delete('veggie'); =cut sub delete { ## no critic 'Subroutines::ProhibitBuiltinHomonyms' my ( $self, $param ) = @_; if ( defined $param && exists $self->{$param} ) { delete $self->{$param}; } return; } =head2 param The C<param> method can be called in three ways. =over 4 =item with no arguments. Returns a list of the parameters contained in the object. my @params = $thingy->param(); =item with a single scalar argument. The value of the parameter with the name of the argument will be retur +ned. my $color = $thingy->param('color'); =item with named arguments A parameter is created for one or more sets of keys and values. $thingy->param(filename => 'logo.jpg', height => 50, width => 100); You could also use a hashref. my $arg_ref = { filename => 'logo.jpg', height => 50, width => 100 }; $thingy->param($arg_ref); The value of a parameter need not be a scalar, it could be any any sor +t of reference even a coderef. $thingy->param(number => &pick_a_random_number); Does not return anything. =back =cut sub param { my ( $self, @args ) = @_; my $num_args = scalar @args; if ($num_args) { if ( ref $args[0] eq 'HASH' ) { # a hashref %{$self} = ( %{$self}, %{ $args[0] } ); } elsif ( $num_args % 2 == 0 ) { # a hash %{$self} = ( %{$self}, @args ); } elsif ( $num_args == 1 ) { # a scalar return $self->{ $args[0] }; } else { croak('Odd number of arguments passed to param().'); } } else { return keys %{$self}; } return; } 1;

    What do you think? I can finish writing the tests and put it up on on CPAN if it is of interest.

    --
    જલધર

        Well played; I had personally forgotten that the param method allows updates to be made - since I treat it as read-only when fetching parameters from CGI scripts.

        Steve
        --

        Ask and you shall receive.

        I was asking my cubicle mate the other day whether or not such a package existed. He did not know of a specific one, so I posted the topic here. As a regular viewer of the recent additions to CPAN, this morning my cubicle mate made mention of a recently added package....Object::WithParams. Yayyy.

        I must say I feel a little honoured to have planted the thought that so quickly turned into a module.

        Thanks to everyone who contributed to this thread

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://854343]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2015-07-05 09:50 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (61 votes), past polls