package Foo; use strict; use Data::Dumper; sub new { my $class = shift; my ( $package ) = caller; my $objref = { _package => $package }; bless $objref, $class; } sub list_params { my ( $self, $cgi ) = @_; my %formdata; # Use this if OO CGI if ( ref $cgi eq 'CGI' ) { foreach my $key ( $cgi->param ) { my @vals = $cgi->param( $key ); $formdata{ $key } = _format_vals( \@vals ); } # Function-oriented CGI } elsif ( $cgi ) { { # Don't try this at home, kids no strict qw/ refs subs /; my $_param = $self->{ '_package' }.'::param'; my $package = \%{$self->{ '_package' } . '::'}; # Looks like a function oriented call but 'param' was not exported if ( ! exists $package->{ 'param' } ) { return 0; } foreach my $key ( eval $_param ) { my $_param_call = $_param . "($key)"; my @vals = eval $_param_call; $formdata{ $key } = _format_vals( \@vals ); } } } else { return 0; } Dumper( \%formdata ); } sub _format_vals { my $vals = shift; @$vals == 1 ? @$vals[ 0 ] : ! @$vals ? undef : $vals; } "Ovid";