[![Actions Status](https://github.com/nyrdz/Namespace-Subroutines/actions/workflows/test.yml/badge.svg)](https://github.com/nyrdz/Namespace-Subroutines/actions) # NAME Namespace::Subroutines - Finds subroutines in namespace (attributes included). # SYNOPSIS use Namespace::Subroutines; Namespace::Subroutines::find( 'My::App::Controller', sub ( $mod, $subname, $subref, $attrs ) { # $mod = [qw( My App Controller Home )] # $subname = 'foo' # $subref = sub {...} # $attrs = [qw( GET )] } ); package My::App::Controller::Home; sub foo :GET {} # DESCRIPTION Namespace::Subroutines is a module that explores your @INC in order to seek out every module placed within the given namespace. Then, invokes your callback once for every subroutine found in each module. ## Considerations There is one thing to be aware of. This module uses a very simple strategy to decide which subroutines to pick: From all the subroutines present in the module's symbol table, Namespace::Subroutines will keep only those that are explicitly defined. Basically, this module will check each line in the module's source code file and if it starts with a subroutine definition, that subroutine is picked. (regex: $line =~ /^sub\\s+(\\w+)\[\\:\\(\\s\]/) ## Use case: Autogenerate Mojolicious application routes my $r = $self->routes; Namespace::Subroutines::find( 'My::App::Controller', sub ( $mod, $subname, $subref, $attrs ) { my $controller = join( '::', $mod->@* ); my $path = '/' . lc join( '/', $mod->@*, $subname ); foreach my $verb ( $attrs->@* ) { $verb = lc $verb; $r->$verb($path) ->to( controller => $controller, action => $subname ); } } ); package My::App::Controller::Home; sub welcome :GET ($self) { # <-- GET is defined in My::App domain $self->render( msg => 'Hello, world!' ); } # LICENSE Copyright (C) José Manuel Rodríguez D.. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. # AUTHOR José Manuel Rodríguez D.