package ClassA; use strict; use warnings; use Sub::Signatures qw/methods/; sub new { bless {} => shift } sub foo($class, $bar) { if ( 'ARRAY' eq ref $bar ) { return sprintf "arrayref with %d elements" => scalar @$bar; } elsif ( 'HASH' eq ref $bar ) { $bar->{this} = 1; return $bar; } else { die "Must be array or hash"; } } sub bar($class, $bar) { $bar; } sub bar(fallback) { return ['fallback', @_]; } sub match($class, $bar) { $bar; } sub subref ($self, $foo) { return sub ($bar) { return "$foo $bar"; } } 1;