sub worker { my ($self, $subclass, $name, $code) = (undef,'Worker','work'); if( @_ == 2) { ($self,$code) = @_; } elsif( @_ == 3) { ($self,$name,$code) = @_; } elsif( @_ == 4 ) { ($self,$subclass,$name,$code) = @_; }; my $n = "$self\::$subclass\::$name"; no strict 'refs'; *{$n} = $code; }; __PACKAGE__->worker('Tool' => 'toolit' => sub { ... }); __PACKAGE__->worker(sub { ... });