View | Details | Raw Unified | Return to bug 4444
Collapse All | Expand All

(-)a/C4/Installer.pm (+1 lines)
Lines 22-27 use strict; Link Here
22
22
23
our $VERSION = 3.00;
23
our $VERSION = 3.00;
24
use C4::Context;
24
use C4::Context;
25
use C4::Installer::PerlModules 1.000000;
25
26
26
=head1 NAME
27
=head1 NAME
27
28
(-)a/C4/Installer/PerlDependencies.pm (+494 lines)
Line 0 Link Here
1
package C4::Installer::PerlDependencies;
2
3
use warnings;
4
use strict;
5
6
our $PERL_DEPS = {
7
    'XML::LibXSLT' => {
8
        'usage'    => 'Core',
9
        'required' => '1',
10
        'min_ver'  => '1.59'
11
    },
12
    'Text::CSV::Encoded' => {
13
        'usage'    => 'Core',
14
        'required' => '1',
15
        'min_ver'  => '0.09'
16
    },
17
    'Storable' => {
18
        'usage'    => 'Core',
19
        'required' => '1',
20
        'min_ver'  => '2.21'
21
    },
22
    'PDF::API2' => {
23
        'usage'    => 'Core',
24
        'required' => '1',
25
        'min_ver'  => '2'
26
    },
27
    'Text::CSV_XS' => {
28
        'usage'    => 'Core',
29
        'required' => '1',
30
        'min_ver'  => '0.32'
31
    },
32
    'Schedule::At' => {
33
        'usage'    => 'Core',
34
        'required' => '1',
35
        'min_ver'  => '1.06'
36
    },
37
    'MIME::Lite' => {
38
        'usage'    => 'Core',
39
        'required' => '1',
40
        'min_ver'  => '3'
41
    },
42
    'GD' => {
43
        'usage'    => 'Patron Images Feature',
44
        'required' => '0',
45
        'min_ver'  => '2.39'
46
    },
47
    'List::MoreUtils' => {
48
        'usage'    => 'Core',
49
        'required' => '1',
50
        'min_ver'  => '0.21'
51
    },
52
    'DBI' => {
53
        'usage'    => 'Core',
54
        'required' => '1',
55
        'min_ver'  => '1.53'
56
    },
57
    'Net::Z3950::ZOOM' => {
58
        'usage'    => 'Core',
59
        'required' => '1',
60
        'min_ver'  => '1.16'
61
    },
62
    'Biblio::EndnoteStyle' => {
63
        'usage'    => 'Core',
64
        'required' => '1',
65
        'min_ver'  => '0.05'
66
    },
67
    'Date::Calc' => {
68
        'usage'    => 'Core',
69
        'required' => '1',
70
        'min_ver'  => '5.4'
71
    },
72
    'Mail::Sendmail' => {
73
        'usage'    => 'Core',
74
        'required' => '1',
75
        'min_ver'  => '0.79'
76
    },
77
    'DBD::mysql' => {
78
        'usage'    => 'Core',
79
        'required' => '1',
80
        'min_ver'  => '4.004'
81
    },
82
    'XML::LibXML' => {
83
        'usage'    => 'Core',
84
        'required' => '1',
85
        'min_ver'  => '1.59'
86
    },
87
    'POE' => {
88
        'usage'    => 'Core',
89
        'required' => '1',
90
        'min_ver'  => '0.9999'
91
    },
92
    'Email::Date' => {
93
        'usage'    => 'Core',
94
        'required' => '1',
95
        'min_ver'  => '1.103'
96
    },
97
    'HTML::Scrubber' => {
98
        'usage'    => 'Core',
99
        'required' => '1',
100
        'min_ver'  => '0.08'
101
    },
102
    'XML::Dumper' => {
103
        'usage'    => 'Core',
104
        'required' => '1',
105
        'min_ver'  => '0.81'
106
    },
107
    'URI::Escape' => {
108
        'usage'    => 'Core',
109
        'required' => '1',
110
        'min_ver'  => '1.36'
111
    },
112
    'Unicode::Normalize' => {
113
        'usage'    => 'Core',
114
        'required' => '1',
115
        'min_ver'  => '0.32'
116
    },
117
    'Text::Wrap' => {
118
        'usage'    => 'Core',
119
        'required' => '1',
120
        'min_ver'  => '2005.082401'
121
    },
122
    'Test' => {
123
        'usage'    => 'Core',
124
        'required' => '1',
125
        'min_ver'  => '1.25'
126
    },
127
    'Locale::PO' => {
128
        'usage'    => 'Core',
129
        'required' => '1',
130
        'min_ver'  => '0.17'
131
    },
132
    'LWP::Simple' => {
133
        'usage'    => 'Core',
134
        'required' => '1',
135
        'min_ver'  => '1.41'
136
    },
137
    'DBD::SQLite2' => {
138
        'usage'    => 'Offline Circulation Feature',
139
        'required' => '0',
140
        'min_ver'  => '0.33'
141
    },
142
    'SMS::Send' => {
143
        'usage'    => 'SMS Messaging Feature',
144
        'required' => '0',
145
        'min_ver'  => '0.05'
146
    },
147
    'XML::SAX::ParserFactory' => {
148
        'usage'    => 'Core',
149
        'required' => '1',
150
        'min_ver'  => '1.01'
151
    },
152
    'Test::Harness' => {
153
        'usage'    => 'Core',
154
        'required' => '1',
155
        'min_ver'  => '2.56'
156
    },
157
    'PDF::API2::Util' => {
158
        'usage'    => 'Core',
159
        'required' => '1',
160
        'min_ver'  => '2'
161
    },
162
    'Class::Accessor' => {
163
        'usage'    => 'Core',
164
        'required' => '1',
165
        'min_ver'  => '0.3'
166
    },
167
    'HTTP::OAI' => {
168
        'usage'    => 'Core',
169
        'required' => '1',
170
        'min_ver'  => '3.2'
171
    },
172
    'LWP::UserAgent' => {
173
        'usage'    => 'Core',
174
        'required' => '1',
175
        'min_ver'  => '2.033'
176
    },
177
    'MIME::Base64' => {
178
        'usage'    => 'Core',
179
        'required' => '1',
180
        'min_ver'  => '3.07'
181
    },
182
    'Algorithm::CheckDigits' => {
183
        'usage'    => 'Core',
184
        'required' => '1',
185
        'min_ver'  => '0.5'
186
    },
187
    'Net::LDAP' => {
188
        'usage'    => 'LDAP Interface Feature',
189
        'required' => '0',
190
        'min_ver'  => '0.33'
191
    },
192
    'PDF::Reuse' => {
193
        'usage'    => 'Core',
194
        'required' => '1',
195
        'min_ver'  => '0.33'
196
    },
197
    'DateTime' => {
198
        'usage'    => 'Core',
199
        'required' => '1',
200
        'min_ver'  => '0.51'
201
    },
202
    'Graphics::Magick' => {
203
        'usage'    => 'Patron Card Creator Feature',
204
        'required' => '0',
205
        'min_ver'  => '1.3.7'
206
    },
207
    'MARC::Charset' => {
208
        'usage'    => 'Core',
209
        'required' => '1',
210
        'min_ver'  => '0.98'
211
    },
212
    'Memoize::Memcached' => {
213
        'usage'    => 'Memcached Feature (Experimental)',
214
        'required' => '0',
215
        'min_ver'  => '0.03'
216
    },
217
    'Net::LDAP::Filter' => {
218
        'usage'    => 'LDAP Interface Feature',
219
        'required' => '0',
220
        'min_ver'  => '0.14'
221
    },
222
    'Text::CSV' => {
223
        'usage'    => 'Core',
224
        'required' => '1',
225
        'min_ver'  => '0.01'
226
    },
227
    'PDF::Table' => {
228
        'usage'    => 'Core',
229
        'required' => '1',
230
        'min_ver'  => '0.9.3'
231
    },
232
    'CGI' => {
233
        'usage'    => 'Core',
234
        'required' => '1',
235
        'min_ver'  => '3.15'
236
    },
237
    'Class::Factory::Util' => {
238
        'usage'    => 'Core',
239
        'required' => '1',
240
        'min_ver'  => '1.6'
241
    },
242
    'List::Util' => {
243
        'usage'    => 'Core',
244
        'required' => '1',
245
        'min_ver'  => '1.18'
246
    },
247
    'Lingua::Stem::Snowball' => {
248
        'usage'    => 'Core',
249
        'required' => '1',
250
        'min_ver'  => '0.952'
251
    },
252
    'Time::localtime' => {
253
        'usage'    => 'Core',
254
        'required' => '1',
255
        'min_ver'  => '1.02'
256
    },
257
    'Digest::SHA' => {
258
        'usage'    => 'Core',
259
        'required' => '1',
260
        'min_ver'  => '5.43'
261
    },
262
    'Date::ICal' => {
263
        'usage'    => 'Core',
264
        'required' => '1',
265
        'min_ver'  => '1.72'
266
    },
267
    'MARC::Crosswalk::DublinCore' => {
268
        'usage'    => 'Core',
269
        'required' => '1',
270
        'min_ver'  => '0.02'
271
    },
272
    'CGI::Session::Serialize::yaml' => {
273
        'usage'    => 'Core',
274
        'required' => '1',
275
        'min_ver'  => '4.2'
276
    },
277
    'CGI::Carp' => {
278
        'usage'    => 'Core',
279
        'required' => '1',
280
        'min_ver'  => '1.29'
281
    },
282
    'Getopt::Long' => {
283
        'usage'    => 'Core',
284
        'required' => '1',
285
        'min_ver'  => '2.35'
286
    },
287
    'HTML::Template::Pro' => {
288
        'usage'    => 'Core',
289
        'required' => '1',
290
        'min_ver'  => '0.69'
291
    },
292
    'Term::ANSIColor' => {
293
        'usage'    => 'Core',
294
        'required' => '1',
295
        'min_ver'  => '1.1'
296
    },
297
    'Getopt::Std' => {
298
        'usage'    => 'Core',
299
        'required' => '1',
300
        'min_ver'  => '1.05'
301
    },
302
    'Data::Dumper' => {
303
        'usage'    => 'Core',
304
        'required' => '1',
305
        'min_ver'  => '2.121'
306
    },
307
    'Lingua::Stem' => {
308
        'usage'    => 'Core',
309
        'required' => '1',
310
        'min_ver'  => '0.82'
311
    },
312
    'MIME::QuotedPrint' => {
313
        'usage'    => 'Core',
314
        'required' => '1',
315
        'min_ver'  => '3.07'
316
    },
317
    'IPC::Cmd' => {
318
        'usage'    => 'Core',
319
        'required' => '1',
320
        'min_ver'  => '0.46'
321
    },
322
    'HTTP::Cookies' => {
323
        'usage'    => 'Core',
324
        'required' => '1',
325
        'min_ver'  => '1.39'
326
    },
327
    'HTTP::Request::Common' => {
328
        'usage'    => 'Core',
329
        'required' => '1',
330
        'min_ver'  => '1.26'
331
    },
332
    'PDF::Reuse::Barcode' => {
333
        'usage'    => 'Core',
334
        'required' => '1',
335
        'min_ver'  => '0.05'
336
    },
337
    'Test::More' => {
338
        'usage'    => 'Core',
339
        'required' => '1',
340
        'min_ver'  => '0.8'
341
    },
342
    'GD::Barcode::UPCE' => {
343
        'usage'    => 'Core',
344
        'required' => '1',
345
        'min_ver'  => '1.1'
346
    },
347
    'Text::Iconv' => {
348
        'usage'    => 'Core',
349
        'required' => '1',
350
        'min_ver'  => '1.7'
351
    },
352
    'File::Temp' => {
353
        'usage'    => 'Core',
354
        'required' => '1',
355
        'min_ver'  => '0.16'
356
    },
357
    'Date::Manip' => {
358
        'usage'    => 'Core',
359
        'required' => '1',
360
        'min_ver'  => '5.44'
361
    },
362
    'Locale::Language' => {
363
        'usage'    => 'Core',
364
        'required' => '1',
365
        'min_ver'  => '2.07'
366
    },
367
    'PDF::API2::Simple' => {
368
        'usage'    => 'Core',
369
        'required' => '1',
370
        'min_ver'  => '1'
371
    },
372
    'XML::RSS' => {
373
        'usage'    => 'Core',
374
        'required' => '1',
375
        'min_ver'  => '1.31'
376
    },
377
    'XML::Simple' => {
378
        'usage'    => 'Core',
379
        'required' => '1',
380
        'min_ver'  => '2.14'
381
    },
382
    'PDF::API2::Page' => {
383
        'usage'    => 'Core',
384
        'required' => '1',
385
        'min_ver'  => '2'
386
    },
387
    'CGI::Session' => {
388
        'usage'    => 'Core',
389
        'required' => '1',
390
        'min_ver'  => '4.2'
391
    },
392
    'POSIX' => {
393
        'usage'    => 'Core',
394
        'required' => '1',
395
        'min_ver'  => '1.09'
396
    },
397
    'Digest::MD5' => {
398
        'usage'    => 'Core',
399
        'required' => '1',
400
        'min_ver'  => '2.36'
401
    },
402
    'Authen::CAS::Client' => {
403
        'usage'    => 'Core',
404
        'required' => '1',
405
        'min_ver'  => '0.05'
406
    },
407
    'Data::ICal' => {
408
        'usage'    => 'Core',
409
        'required' => '1',
410
        'min_ver'  => '0.13'
411
    },
412
    'MARC::Record' => {
413
        'usage'    => 'Core',
414
        'required' => '1',
415
        'min_ver'  => '2'
416
    },
417
    'Locale::Currency::Format' => {
418
        'usage'    => 'Core',
419
        'required' => '1',
420
        'min_ver'  => '1.28'
421
    },
422
    'Number::Format' => {
423
        'usage'    => 'Core',
424
        'required' => '1',
425
        'min_ver'  => '1.52'
426
    },
427
    'YAML::Syck' => {
428
        'usage'    => 'Core',
429
        'required' => '1',
430
        'min_ver'  => '0.71'
431
    },
432
    'Time::HiRes' => {
433
        'usage'    => 'Core',
434
        'required' => '1',
435
        'min_ver'  => '1.86'
436
    },
437
    'MARC::File::XML' => {
438
        'usage'    => 'Core',
439
        'required' => '1',
440
        'min_ver'  => '0.88'
441
    },
442
    'XML::SAX::Writer' => {
443
        'usage'    => 'Core',
444
        'required' => '1',
445
        'min_ver'  => '0.44'
446
    },
447
    'JSON' => {
448
        'usage'    => 'Core',
449
        'required' => '1',
450
        'min_ver'  => '2.07'
451
    }
452
};
453
454
1;
455
456
__END__
457
458
=head1 NAME
459
460
C4::Installer::PerlDependencies
461
462
=head1 ABSTRACT
463
464
A module for cataloging Koha Perl dependencies.
465
466
=head1 SYNOPSIS
467
468
This module's sole purpose for existence is to provide a single location to catalog all Koha Perl dependencies. New dependencies should be added to the
469
end of the outer hash and follow the key/value pattern used in the other dependencies.
470
471
=head1 AUTHOR
472
473
Chris Nighswonger <cnighswonger AT foundations DOT edu>
474
475
=head1 COPYRIGHT
476
477
Copyright 2010 Foundations Bible College.
478
479
=head1 LICENSE
480
481
This file is part of Koha.
482
483
Koha is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
484
Foundation; either version 2 of the License, or (at your option) any later version.
485
486
You should have received a copy of the GNU General Public License along with Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
487
Suite 330, Boston, MA  02111-1307 USA
488
489
=head1 DISCLAIMER OF WARRANTY
490
491
Koha is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
492
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
493
494
=cut
(-)a/C4/Installer/PerlModules.pm (-1 / +249 lines)
Line 0 Link Here
0
- 
1
package C4::Installer::PerlModules;
2
3
use warnings;
4
use strict;
5
6
use File::Spec;
7
8
use C4::Installer::PerlDependencies;
9
10
use version; our $VERSION = qv('1.0.0_1');
11
12
our $PERL_DEPS = $C4::Installer::PerlDependencies::PERL_DEPS;
13
14
sub new {
15
    my $invocant = shift;
16
    my $self = {
17
        missing_pm  => [],
18
        upgrade_pm  => [],
19
        current_pm  => [],
20
    };
21
    my $type = ref($invocant) || $invocant;
22
    bless ($self, $type);
23
    return $self;
24
}
25
26
sub prereq_pm {
27
    my $self = shift;
28
    my $prereq_pm = {};
29
    for (keys %$PERL_DEPS) {
30
        $prereq_pm->{$_} = $PERL_DEPS->{$_}->{'min_ver'};
31
    }
32
    return $prereq_pm;
33
}
34
35
sub required {
36
    my $self = shift;
37
    my %params = @_;
38
    if ($params{'module'}) {
39
        return -1 unless grep {m/$params{'module'}/} keys(%$PERL_DEPS);
40
        return $PERL_DEPS->{$params{'module'}}->{'required'};
41
    }
42
    elsif ($params{'required'}) {
43
        my $required_pm = [];
44
        for (keys %$PERL_DEPS) {
45
            push (@$required_pm, $_) if $PERL_DEPS->{$_}->{'required'} == 1;
46
        }
47
        return $required_pm;
48
    }
49
    elsif ($params{'optional'}) {
50
        my $optional_pm = [];
51
        for (keys %$PERL_DEPS) {
52
            push (@$optional_pm, $_) if $PERL_DEPS->{$_}->{'required'} == 0;
53
        }
54
        return $optional_pm;
55
    }
56
    else {
57
        return -1; # unrecognized parameter passed in
58
    }
59
}
60
61
sub version_info {
62
    no warnings; # perl throws warns for invalid $VERSION numbers which some modules use
63
    my $self = shift;
64
#   Reset these arrayref each pass through to ensure current information
65
    $self->{'missing_pm'} = [];
66
    $self->{'upgrade_pm'} = [];
67
    $self->{'current_pm'} = [];
68
    my %params = @_;
69
    if ($params{'module'}) {
70
        return -1 unless grep {m/$params{'module'}/} keys(%$PERL_DEPS);
71
        eval "require $params{'module'}";
72
        if ($@) {
73
            return {$params{'module'} => {cur_ver => 0, min_ver => $PERL_DEPS->{$_}->{'min_ver'}, upgrade => 0, required => $PERL_DEPS->{$_}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}};
74
        }
75
        elsif ($params{'module'}->VERSION lt $PERL_DEPS->{$params{'module'}}->{'min_ver'}) {
76
            return {$params{'module'} => {cur_ver => $params{'module'}->VERSION, min_ver => $PERL_DEPS->{$params{'module'}}->{'min_ver'}, upgrade => 1, required => $PERL_DEPS->{$params{'module'}}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}};
77
        }
78
        else {
79
            return {$params{'module'} => {cur_ver => $params{'module'}->VERSION, min_ver => $PERL_DEPS->{$params{'module'}}->{'min_ver'}, upgrade => 0, required => $PERL_DEPS->{$params{'module'}}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}};
80
        }
81
    }
82
    else {
83
        for (keys(%$PERL_DEPS)) {
84
            eval "require $_";
85
            if ($@) {
86
                push (@{$self->{'missing_pm'}}, {$_ => {cur_ver => 0, min_ver => $PERL_DEPS->{$_}->{'min_ver'}, required => $PERL_DEPS->{$_}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}});
87
            }
88
            elsif ($_->VERSION lt $PERL_DEPS->{$_}->{'min_ver'}) {
89
                push (@{$self->{'upgrade_pm'}}, {$_ => {cur_ver => $_->VERSION, min_ver => $PERL_DEPS->{$_}->{'min_ver'}, required => $PERL_DEPS->{$_}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}});
90
            }
91
            else {
92
                push (@{$self->{'current_pm'}}, {$_ => {cur_ver => $_->VERSION, min_ver => $PERL_DEPS->{$_}->{'min_ver'}, required => $PERL_DEPS->{$_}->{'required'}, usage => $PERL_DEPS->{$_}->{'usage'}}});
93
            }
94
        }
95
        return;
96
    }
97
}
98
99
sub get_attr {
100
    return $_[0]->{$_[1]};
101
}
102
103
sub module_count {
104
    return scalar(keys(%$PERL_DEPS));
105
}
106
107
sub module_list {
108
    return keys(%$PERL_DEPS);
109
}
110
111
1;
112
__END__
113
114
=head1 NAME
115
116
C4::Installer::PerlModules
117
118
=head1 ABSTRACT
119
120
A module for manipulating Koha Perl dependency list objects.
121
122
=head1 METHODS
123
124
=head2 new()
125
126
    Creates a new PerlModules object 
127
128
    example:
129
        C<my $perl_modules = C4::Installer::PerlModules->new;>
130
131
=head2 prereq_pm()
132
133
    Returns a hashref of a hash of module information suitable for use in Makefile.PL
134
135
    example:
136
        C<my $perl_modules = C4::Installer::PerlModules->new;
137
138
        ...
139
140
        PREREQ_PM    => $perl_modules->prereq_pm,>
141
142
=head2 required()
143
144
    This method accepts a single parameter with three possible values: a module name, the keyword 'required,' the keyword 'optional.' If passed the name of a module, a boolean value is returned indicating whether the module is required (1) or not (0). If on of the two keywords is passed in, it returns an arrayref to an array who's elements are the names of the modules specified either required or optional.
145
146
    example:
147
        C<my $is_required = $perl_modules->required(module => 'CGI::Carp');>
148
149
        C<my $optional_pm_names = $perl_modules->required(optional => 1);>
150
151
=head2 version_info()
152
153
    Depending on the parameters passed when invoking, this method will give the current status of modules currently used in Koha as well as the currently installed version if the module is installed, the current minimum required version, and the upgrade status. If passed C<module => module_name>, the method evaluates only that module. If passed C<all => 1>, all modules are evaluated.
154
155
    example:
156
        C<my $module_status = $perl_modules->version_info(module => 'foo');>
157
158
        This usage returns a hashref with a single key/value pair. The key is the module name. The value is an anonymous hash with the following keys:
159
160
        cur_ver = version number of the currently installed version (This is 0 if the module is not currently installed.)
161
        min_ver = minimum version required by Koha
162
        upgrade = upgrade status of the module relative to Koha's requirements (0 if the installed module does not need upgrading; 1 if it does)
163
        required = 0 of the module is optional; 1 if required
164
165
        {
166
          'CGI::Carp' => {
167
                           'required' => 1,
168
                           'cur_ver' => '1.30_01',
169
                           'upgrade' => 0,
170
                           'min_ver' => '1.29'
171
                         }
172
        };
173
174
        C<$perl_modules->version_info;>
175
176
        This usage loads the same basic data as the previous usage into three accessors: missing_pm, upgrade_pm, and current_pm. Each of these may be accessed by using the C<get_attr> method. Each accessor returns an anonymous array who's elements are anonymous hashes. They follow this format (NOTE: Upgrade status is indicated by the accessor name.):
177
178
        [
179
                  {
180
                    'Text::CSV::Encoded' => {
181
                                              'required' => 1,
182
                                              'cur_ver' => 0.09,
183
                                              'min_ver' => '0.09'
184
                                            }
185
                  },
186
                  {
187
                    'Biblio::EndnoteStyle' => {
188
                                                'required' => 1,
189
                                                'cur_ver' => 0,
190
                                                'min_ver' => '0.05'
191
                                              }
192
                  },
193
        }
194
195
=head2 get_attr(attr_name)
196
197
    Returns an anonymous array containing the contents of the passed in accessor. Valid accessors are:
198
199
    missing_pm - Perl modules used by Koha but not currently installed.
200
201
    upgrade_pm - Perl modules currently installed but below the minimum version required by Koha.
202
203
    current_pm - Perl modules currently installed and up to date as required by Koha.
204
205
    example:
206
        C<my $missing_pm = $perl_modules->get_attr('missing_pm');>
207
208
=head2 module_count
209
210
    Returns a scalar value representing the current number of Perl modules used by Koha.
211
212
    example:
213
        C<my $module_count = $perl_modules->module_count;>
214
215
=head2 module_list
216
217
    Returns an array who's elements are the names of the Perl modules used by Koha.
218
219
    example:
220
        C<my @module_list = $perl_modules->module_list;>
221
222
    This is useful for commandline exercises such as:
223
224
        perl -MC4::Installer::PerlModules -e 'my $deps = C4::Installer::PerlModule->new; print (join("\n",$deps->module_list));'
225
226
=head1 AUTHOR
227
228
Chris Nighswonger <cnighswonger AT foundations DOT edu>
229
230
=head1 COPYRIGHT
231
232
Copyright 2010 Foundations Bible College.
233
234
=head1 LICENSE
235
236
This file is part of Koha.
237
238
Koha is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software
239
Foundation; either version 2 of the License, or (at your option) any later version.
240
241
You should have received a copy of the GNU General Public License along with Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
242
Suite 330, Boston, MA  02111-1307 USA
243
244
=head1 DISCLAIMER OF WARRANTY
245
246
Koha is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
247
A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
248
249
=cut

Return to bug 4444