my $sClass = derive_class($foo); my $oWhatWasOnceASwitchStatementCase = $sClass->new(); $oWhatWasOnceASwitchStatementCase->frobnicate(); #### use strict; use warnings; #pretend command line is indirect user input my $foo = \@ARGV; #indirect user input #this replaces your switch statement # use derive_class($foo) to select the class # use frobinate() to replace the action for each if statement branch my $sClass = derive_class($foo); my $oWhatWasOnceASwitchStatementCase = $sClass->new(); $oWhatWasOnceASwitchStatementCase->frobnicate(); #dummy implementation of derive_class($foo) #converts command line arguments to a class sub derive_class { my ($sClass) = $foo->[0]; $sClass = 'Demo::Base' unless $sClass =~ /^Demo::[AB]$/; return $sClass; } #here are your class definitions #implement default case { package Demo::Base; sub new { my ($sClass) = @_; my $self = {}; return bless($self, $sClass); } sub frobnicate { my ($self) = @_; #do similar_to_a print "I'm defaulting to something similar to A\n"; } } #implement when A { package Demo::A; use base 'Demo::Base'; sub frobnicate { my ($self) = @_; #do A print "I'm doing A\n"; } } #implement when B { package Demo::B; use base 'Demo::Base'; sub frobnicate { my ($self) = @_; #do B print "I'm doing B\n"; } }