Yes, I see. I suppose the logic of my approach is to add another level *throughout* the hash. Then it does get quite big, though it also remains logical and regular in a slightly obsessive-compulsive way. Untested:
sub get_branch_function {
my $query = shift;
my $action = $query->param('action') ? $query->param('action') :
+'default';
my $update = $query->param('update') ? 'update' : 'default';
my $confirm = $query->param('confirm') ? 'confirm' : 'default';
my $commit = $query->param('commit') ? 'commit' : 'default';
my %dispatch = (
add => {
update => {
confirm => {
commit => \&commit_dialog,
default => \&add_dialog,
},
default => {
commit => \&add_dialog,
default => \&add_dialog,
},
},
default => {
confirm => {
commit => \&commit_dialog,
default => \&add_dialog,
},
default => {
commit => \&add_dialog,
default => \&add_dialog,
},
},
},
remove => {
update => {
confirm => {
commit => \&commit_dialog,
default => \&confirm_dialog,
},
default => {
commit => \&choose_dialog,
default => \&choose_dialog,
},
},
default => {
confirm => {
commit => \&commit_dialog,
default => \&confirm_dialog,
},
default => {
commit => \&choose_dialog,
default => \&choose_dialog,
},
},
},
modify => {
update => {
confirm => {
commit => \&commit_dialog,
default => \&confirm_dialog,
},
default => {
commit => \&choose_dialog,
default => \&choose_dialog,
},
},
default => {
confirm => {
commit => \&choose_dialog,
default => \&choose_dialog,
},
default => {
commit => \&choose_dialog,
default => \&choose_dialog,
},
},
},
default => {
update => {
confirm => {
commit => \&action_dialog,
default => \&action_dialog,
},
default => {
commit => \&action_dialog,
default => \&action_dialog,
},
},
default => {
confirm => {
commit => \&action_dialog,
default => \&action_dialog,
},
default => {
commit => \&action_dialog,
default => \&action_dialog,
},
},
},
);
return $dispatch{ $action }{ $update }{ $confirm }{ $commit };
}
§ George Sherston |