sub process { my $node = shift; if (my $reftype = ref($node)) { return process_array($node) if $reftype eq 'ARRAY'; return process_hash($node) if $reftype eq 'HASH'; die "invalid node type: $reftype"; } else { return process_scalar($node); } } process({ 'a' => '1', 'b' => [ '2' ], 'c' => { 'd' => '3' } }); #### package Local::MyComp::Map; sub new { ... } sub get { ... } sub set { ... } sub keys { ... } etc. etc. #### if (my $reftype = ref($node)) { if (blessed($node) && $node->isa(Local::MyComp::Map) { process_map($node); } ...