/usr/local/CPAN/HTML-Bricks/HTML/Bricks/Args.pm
#-----------------------------------------------------------------------------
# File: Args.pm
#-----------------------------------------------------------------------------
package HTML::Bricks::Args;
use strict;
our $VERSION = '0.02';
#---------------------------------------------------------------------
# process_args
#---------------------------------------------------------------------
sub process_args {
my $r = Apache->request;
my %ARGS = $r->method eq 'POST' ? $r->content : $r->args;
my $rARGS = \%ARGS;
#
# If the user pressed a submit button on a form, only the form args
# are available, but the command line args on the URI
# (ex: http://www.somewhere.com/index.html?arg1=val1&arg2=val2) are
# not available. Process them here to make them available.
#
# Is this a bug or a feature?
#
my %ua = $r->args;
foreach (keys %ua) {
if (!defined $$rARGS{$_}) {
$$rARGS{$_} = $ua{$_};
}
}
#
# search for global args (denoted by g:arg=value)
#
%HTML::Bricks::global_args = my %blank_hash;
foreach (keys %$rARGS) {
if ($_ =~ /g:(.*)/) {
$HTML::Bricks::global_args{$1} = $$rARGS{$_};
}
}
#
# Now that all the args are available, parse 'em
#
my %a;
foreach (keys %$rARGS) {
my $ra = \%a;
next if $_ eq '';
my @fields = split(':', $_);
if ($#fields != 1) {
print STDERR "Illegal arg: \"$_\". Args must be of the form brick_id:arg=value.\n";
next;
}
my $rsub_ARGS;
my $brick_id = shift @fields;
my @b = split('\.',$brick_id);
while (defined ($brick_id = shift @b)) {
next if $brick_id eq 'g';
if (!defined $$ra{$brick_id}) {
$$ra{$brick_id} = { rARGS => {}, rsub_ARGS => {} };
}
$rsub_ARGS = ${$$ra{$brick_id}}{rARGS};
$ra = ${$$ra{$brick_id}}{rsub_ARGS};
}
$$rsub_ARGS{shift @fields} = $$rARGS{$_};
}
return (undef, \%a);
}
return 1;