Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^3: Ubiquity of the CGI param method

by jaldhar (Vicar)
on Aug 12, 2010 at 06:30 UTC ( #854593=note: print w/ replies, xml ) Need Help??


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

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.

--
જલધર


Comment on Re^3: Ubiquity of the CGI param method
Download Code
Replies are listed 'Best First'.
Re^4: Ubiquity of the CGI param method
by jaldhar (Vicar) on Aug 13, 2010 at 06:12 UTC

      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://854593]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (16)
As of 2015-07-30 15:00 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 (271 votes), past polls