1Applify(3) User Contributed Perl Documentation Applify(3)
2
3
4
6 Applify - Write object oriented scripts with ease
7
9 0.21
10
12 This module should keep all the noise away and let you write scripts
13 very easily. These scripts can even be unit tested even though they are
14 defined directly in the script file and not in a module.
15
17 #!/usr/bin/perl
18 use Applify;
19
20 option file => input_file => 'File to read from';
21 option dir => output_dir => 'Directory to write files to';
22 option flag => dry_run => 'Use --no-dry-run to actually do something', 1;
23
24 documentation __FILE__;
25 version 1.23;
26
27 sub generate_exit_value {
28 return int rand 100;
29 }
30
31 # app {...}; must be the last statement in the script
32 app {
33 my ($app, @extra) = @_;
34 my $exit_value = 0;
35
36 print "Extra arguments: @extra\n" if(@extra);
37 print "Will read from: ", $app->input_file, "\n";
38 print "Will write files to: ", $app->output_dir, "\n";
39
40 if($app->dry_run) {
41 die 'Will not run script';
42 }
43
44 return $app->generate_exit_value;
45 };
46
48 This module will generate an application class, which $app inside the
49 "app" block is an instance of. The class will have these methods:
50
51 · "new()"
52
53 An object constructor. This method will not be auto generated if any
54 of the classes given to "extends" has the method "new()".
55
56 · "run()"
57
58 This method is basically the code block given to "app".
59
60 · Other methods
61
62 Other methods defined in the script file will be accesible from $app
63 inside "app{}".
64
65 · "_script()"
66
67 This is an accessor which return the Applify object which is refered
68 to as $script in this documentation.
69
70 NOTE: This accessor starts with an underscore to prevent conflicts
71 with "options".
72
73 · Other accessors
74
75 Any "option" (application option) will be available as an accessor on
76 the application object.
77
79 option
80 option $type => $name => $documentation;
81 option $type => $name => $documentation, $default;
82 option $type => $name => $documentation, $default, @args;
83 option $type => $name => $documentation, @args;
84
85 This function is used to define options which can be given to this
86 application. See "SYNOPSIS" for example code. This function can also be
87 called as a method on $script. Additionally, similar to Moose
88 attributes, a "has_$name" method will be generated, which can be called
89 on $app to determine if the "option" has been set, either by a user or
90 from the $default.
91
92 · $type
93
94 Used to define value types for this input. Can be:
95
96 | $type | Example | Attribute value |
97 |-------|---------------------|-----------------|
98 | bool | --foo, --no-foo | foo=1, foo=0 |
99 | flag | --foo, --no-foo | foo=1, foo=0 |
100 | inc | --verbose --verbose | verbose=2 |
101 | str | --name batwoman | name=batwoman |
102 | int | --answer 42 | answer=42 |
103 | num | --pie 3.14 | pie=3.14 |
104
105 · $name
106
107 The name of an application option. This name will also be used as
108 accessor name inside the application. Example:
109
110 # define an application option:
111 option file => some_file => '...';
112
113 # call the application from command line:
114 > myapp.pl --some-file /foo/bar
115
116 # run the application code:
117 app {
118 my $app = shift;
119 print $app->some_file # prints "/foo/bar"
120 return 0;
121 };
122
123 · $documentation
124
125 Used as description text when printing the usage text.
126
127 · $default
128
129 Either a plain value or a code ref that can be used to generate a
130 value.
131
132 option str => passwd => "Password file", "/etc/passwd";
133 option str => passwd => "Password file", sub { "/etc/passwd" };
134
135 · @args
136
137 · "alias"
138
139 Used to define an alias for the option. Example:
140
141 option inc => verbose => "Output debug information", alias => "v";
142
143 · "required"
144
145 The script will not start if a required field is omitted.
146
147 · "n_of"
148
149 Allow the option to hold a list of values. Examples: "@", "4",
150 "1,3". See "Options-with-multiple-values" in Getopt::Long for
151 details.
152
153 · "isa"
154
155 Can be used to either specify a class that the value should be
156 instantiated as, or a Type::Tiny object that will be used for
157 coercion and/or type validation.
158
159 Example using a class:
160
161 option file => output => "output file", isa => "Mojo::File";
162
163 The "output()" attribute will then later return an object of
164 Mojo::File, instead of just a plain string.
165
166 Example using Type::Tiny:
167
168 use Types::Standard "Int";
169 option num => age => "Your age", isa => Int;
170
171 · Other
172
173 Any other Moose attribute argument may/will be supported in future
174 release.
175
176 documentation
177 documentation __FILE__; # current file
178 documentation '/path/to/file';
179 documentation 'Some::Module';
180
181 Specifies where to retrieve documentaion from when giving the "--man"
182 option to your script.
183
184 version
185 version 'Some::Module';
186 version $num;
187
188 Specifies where to retrieve the version number from when giving the
189 "--version" option to your script.
190
191 extends
192 extends @classes;
193
194 Specify which classes this application should inherit from. These
195 classes can be Moose based.
196
197 hook
198 hook before_exit => sub { my ($script, $exit_value) = @_ };
199 hook before_options_parsing => sub { my ($script, $argv) = @_ };
200
201 Defines a hook to run.
202
203 · before_exit
204
205 Called right before "exit($exit_value)" is called by Applify. Note
206 that this hook will not be called if an exception is thrown.
207
208 · before_options_parsing
209
210 Called right before $argv is parsed by "option_parser". $argv is an
211 array-ref of the raw options given to your application. This hook
212 allows you to modify "option_parser". Example:
213
214 hook before_options_parsing => sub {
215 shift->option_parser->configure(bundling no_pass_through);
216 };
217
218 subcommand
219 subcommand list => 'provide a listing objects' => sub {
220 option flag => long => 'long listing';
221 option flag => recursive => 'recursively list objects';
222 };
223
224 subcommand create => 'create a new object' => sub {
225 option str => name => 'name of new object', required => 1;
226 option str => description => 'description for the object', required => 1;
227 };
228
229 sub command_create {
230 my ($app, @extra) = @_;
231 ## do creating
232 return 0;
233 }
234
235 sub command_list {
236 my ($app, @extra) = @_;
237 ## do listing
238 return 0;
239 }
240
241 app {
242 my ($app, @extra) = @_;
243 ## fallback when no command given.
244 $app->_script->print_help;
245 return 0;
246 };
247
248 This function allows for creating multiple related sub commands within
249 the same script in a similar fashion to "git". The "option", "extends"
250 and "documentation" exported functions may sensibly be called within
251 the subroutine. Calling the function with no arguments will return the
252 running subcommand, i.e. a valid $ARGV[0]. Non valid values for the
253 subcommand given on the command line will result in the help being
254 displayed.
255
256 app
257 app CODE;
258
259 This function will define the code block which is called when the
260 application is started. See "SYNOPSIS" for example code. This function
261 can also be called as a method on $script.
262
263 IMPORTANT: This function must be the last function called in the script
264 file for unit tests to work. Reason for this is that this function runs
265 the application in void context (started from command line), but
266 returns the application object in list/scalar context (from "do" in
267 perlfunc).
268
270 option_parser
271 $script = $script->option_parser(Getopt::Long::Parser->new);
272 $parser = $script->option_parser;
273
274 You can specify your own option parser if you have special needs. The
275 default is:
276
277 Getopt::Long::Parser->new(config => [qw(no_auto_help no_auto_version pass_through)]);
278
279 options
280 $array_ref = $script->options;
281
282 Holds the application options given to "option".
283
285 new
286 $script = Applify->new({options => $array_ref, ...});
287
288 Object constructor. Creates a new object representing the script meta
289 information.
290
291 print_help
292 Will print "options" to selected filehandle (STDOUT by default) in a
293 normalized matter. Example:
294
295 Usage:
296 --foo Foo does this and that
297 * --bar Bar does something else
298
299 --help Print this help text
300 --man Display manual for this application
301 --version Print application name and version
302
303 print_version
304 Will print "version" to selected filehandle (STDOUT by default) in a
305 normalized matter. Example:
306
307 some-script.pl version 1.23
308
309 import
310 Will export the functions listed under "EXPORTED FUNCTIONS". The
311 functions will act on a Applify object created by this method.
312
314 This library is free software. You can redistribute it and/or modify it
315 under the same terms as Perl itself.
316
318 Jan Henning Thorsen - "jhthorsen@cpan.org"
319
320 Roy Storey - "kiwiroy@cpan.org"
321
322
323
324perl v5.30.1 2020-01-29 Applify(3)