use constant PUBLIC => 0, PRIVATE => 1; %query = ( action1 => { visibility => PUBLIC, code => \&handler1, }, action2 => { visibility => PUBLIC, code => \&handler2, }, action3 => { visibility => PRIVATE, code => \&_do_not_advertise, }, ); my @public_actions = grep $query{$_}->{visibility} == PUBLIC, keys %query; #### sub register_action { my( $action, $subname ) = @_; no strict 'refs'; $query{ $action } = { visibility => ($subname =~ /^_/), code => \&{$subname} }; }