Zunächst hardcodest du die Grammatikregeln deines Parsers.
So siehts aus, das Hardcoding hält sich in Grenzen.
if($self->{CONTENT_TYPE} eq 'multipart/c-eav'){
require cEAV;
$self->{eav} = cEAV->decode_eav( $self->{rawdata} );
$self->{param} = $self->{eav}->{param};
}
elsif($self->{CONTENT_TYPE} eq 'multipart/form-data'){
$self->_parse_multipart; # factory
}
elsif( $self->{CONTENT_TYPE} eq 'application/json' ){
require JSON;
my $json = JSON->new;
$self->{json} = $json->decode($self->rawdata);
$self->{param} = $self->{json}{param};
}
else{
# ParameterNamen, application/x-www-form-urlencoded
my $pnames = [ $self->{rawdata} =~ /(\w+)=/g ];
foreach my $pname ( @$pnames ){
my $vals = [$self->{rawdata} =~ /$pname=([^;&]+)/g];
foreach my $v( @$vals){
$v =~ s/\+/ /g;
$v =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
}
$self->{param}{$pname} = $vals;
}
}
Die Scalierbarkeit und Übersichtlichkeit ist sichergestellt. Wenns zuviel wird, wirds in die Factory ausgelagert (Autoloader) . Falls ein neuer Content-Type hinzukommt, ist das ratzfatz eingebaut, da wird nur noch ne Methode aufgerufen.