package My sub new { my ($class,%args) = @_; my $self = bless {}, $class; if ($args{source} eq 'xml') { require My::XML; @ISA = qw/My::XML/; } elsif ($args{source} eq 'json') { require My::JSON; @ISA = qw/My::JSON/; } $self->_init(); # Versions in both My::XML and My::JSON return ($self); } # rest of methods sub method1 { ... } sub method2 { ... } #### package My::XML; sub _init { ... } 1; package My::JSON; sub _init { ... } 1; #### use My; my $obj = My->new(source=>"xml"); # Do whatever with $obj