File Coverage

blib/lib/Getopt/CallingName.pm
Criterion Covered Total %
statement 36 37 97.3
branch 5 6 83.3
condition 4 4 100.0
subroutine 9 9 100.0
pod 1 1 100.0
total 55 57 96.4


line stmt bran cond sub pod time code
1             =head1 NAME
2              
3             Getopt::CallingName - Script duties delegation based upon calling name
4              
5             =head1 SYNOPSIS
6              
7             use Getopt::CallingName;
8             call_name(
9             name_prefix => 'tv_',
10             args => \@my_array,
11             );
12              
13             =head1 DESCRIPTION
14              
15             Sometimes you can have a script that can run in two or more 'modes' of
16             operation. Apart from an option to specify the mode, the command line options
17             are the same/very similar. Much of the code used by the various modes is common.
18              
19             As an application user interface decision, it may be more useful/helpful to be
20             able to call the script by two or more names - i.e. one for each mode. This cuts
21             out the command line option for specifying the mode.
22              
23             In some cases it might be appropriate just to move all the code, or at least all
24             the common code, into a module and have separate wrapper perl scripts. The
25             problem with this approach is either you end up duplicating command line option
26             handling in each of the wrapper scripts or you end up moving the command line
27             option handling into a module also. The former case introduces maintenance
28             burden [or perhaps an excuse to use TT2 to generate your wrappers ;-)]. The
29             latter case can feel like a distortion/displacement of the code.
30              
31             Getopt::CallingName provides another alternative. The idea is that you create
32             symbolic links to your actual script (which you might want to give a generic
33             name). Each symbolic link corresponds to the name/mode with which you call the
34             script. Within your script, after any common setup/options handling you call
35             subroutine call_name to call the appropriate script subroutine for the mode.
36              
37             =head1 PUBLIC INTERFACE
38              
39             =cut
40              
41              
42              
43             package Getopt::CallingName;
44              
45              
46              
47             # pragmata
48 2     2   53666 use 5.006;
  2         7  
  2         103  
49 2     2   11 use base qw(Exporter);
  2         4  
  2         210  
50 2     2   11 use strict;
  2         3  
  2         62  
51 2     2   9 use warnings;
  2         4  
  2         63  
52              
53             # Standard Perl Library and CPAN modules
54 2     2   10 use Carp qw(croak);
  2         3  
  2         154  
55 2     2   18 use English qw( -no_match_vars);
  2         2  
  2         14  
56              
57              
58             our @EXPORT = qw(call_name);
59             our $VERSION = '1.18';
60              
61             #
62             # PUBLIC CLASS METHODS
63             #
64              
65              
66              
67             =head2 Public Class Methods
68              
69             =head3 call_name
70              
71             call_name(
72             args => $ra_args,
73             name_prefix => $name_prefix,
74             method_prefix => $method_prefix,
75             method_suffix => $method_suffix,
76             )
77              
78             call_name accepts the following optional arguments:
79              
80             method_prefix - string to prepend to the calculated method name
81              
82             method_suffix - string to append to the calculated method name
83              
84             name_prefix - string to chop off the front of the script name when calculating
85             the method name. Useful if all your modes have a common
86             prefix (tv_record, tv_play ...)
87              
88             args - reference to an array which should be passed to the called sub.
89              
90             call_name returns whatever the called subroutine returns.
91              
92             call_name checks the subroutine it is going to call to ensure it exists. If it
93             does not exist, call name throws an 'exception' using Carp::croak.
94              
95             =cut
96              
97             sub call_name {
98 3     3 1 2023 my(%args) = @_;
99 3         12 my $name = _get_name(%args);
100 3 50       8 my @args = ($args{args}) ? @{$args{args}} : ();
  3         7  
101              
102 3 100       4 croak "Unable to call subroutine corresponding to name, &main::$name does not exist" unless(defined &{"main::$name"});
  3         211  
103            
104             {
105 2         2 package main;
106 2     2   1092 no strict 'refs';
  2         4  
  2         438  
107 2         7 return $name->(@args);
108             }
109              
110 0         0 1;
111             }
112              
113              
114             #
115             # PRIVATE CLASS METHODS
116             #
117              
118              
119              
120             =head1 INTERNALS
121              
122             =head2 Private Class Methods
123              
124             =head3 _get_name
125              
126             _get_name(
127             name_prefix => $name_prefix,
128             method_prefix => $method_prefix,
129             method_suffix => $method_suffix,
130             )
131              
132             Returns the $PROGRAM_NAME after removing any path, prefix (optional) and
133             extension. Adds and optional method prefix and/or suffix as specified.
134              
135             =cut
136              
137             sub _get_name {
138 13     13   1182 my(%args) = @_;
139              
140 13         58 my($name) = $PROGRAM_NAME =~ m!^(?:(?:.*)/)?([^.]*)!;
141 13 100       75 $name =~ s/^$args{name_prefix}// if(defined $args{name_prefix});
142              
143 13   100     48 $args{method_suffix} ||= '';
144 13   100     44 $args{method_prefix} ||= '';
145              
146 13         23 $name = $args{method_prefix} . $name . $args{method_suffix};
147              
148 13         51 return $name;
149             }
150              
151             1;
152              
153             =head1 INSTALLATION
154              
155             To install this module type the following:
156              
157             perl Makefile.PL
158             make
159             make test
160             make install
161              
162             =head1 DEPENDENCIES
163              
164             This module works only with perl v5.6 and higher. I am more than happy to
165             backport to an earlier perl 5.x if someone using an old perl would like to make
166             use of my module. Mail me and ask me to do the work [or even better do it
167             yourself and send in a patch! ;-)]
168              
169             This module requires these other modules and libraries:
170              
171             Carp
172             Test::More
173              
174             The first is required for its operation. The second is for testing purposes
175              
176             This module has these optional dependencies:
177              
178             File::Find::Rule
179             Test::Pod (0.95 or higher)
180              
181             These are both just requried for testing purposes.
182              
183             =head1 POSSIBLE ENHANCEMENTS
184              
185             =over 4
186              
187             =item *
188              
189             Add a more general method name translation hook
190              
191             =back
192              
193             =head1 BUGS
194              
195             None known at time of writing. To report a bug or request an enhancement use
196             CPAN's excellent Request Tracker:
197              
198             L
199              
200             =head1 SOURCE AVAILABILITY
201              
202             This source is part of a SourceForge project which always has the
203             latest sources in svn.
204              
205             http://sourceforge.net/projects/sagar-r-shah/
206              
207             =head1 AUTHOR
208              
209             Sagar R. Shah
210              
211             =head1 COPYRIGHT
212              
213             Copyright 2003-2007, Sagar R. Shah, All rights reserved
214              
215             This program is free software; you can redistribute it and/or modify it
216             under the same terms as Perl itself.
217              
218             =cut