Adding MooseX::Getopt first draft
[gitmo/MooseX-Getopt.git] / lib / MooseX / Getopt.pm
CommitLineData
5dac17c3 1
2package MooseX::Getopt;
3use Moose::Role;
4
5use Getopt::Long;
6
7use MooseX::Getopt::OptionTypes;
8use MooseX::Getopt::Meta::Attribute;
9
10sub new_with_options {
11 my ($class, %params) = @_;
12
13 my (%options, %constructor_options);
14 foreach my $attr ($class->meta->compute_all_applicable_attributes) {
15 my $name = $attr->name;
16
17 if ($attr->isa('MooseX::Getopt::Meta::Attribute') && $attr->has_cmd_flag) {
18 $name = $attr->cmd_flag;
19 }
20
21 my $init_arg = $attr->init_arg;
22
23 # create a suitable default value
24 $constructor_options{$init_arg} = '';
25
26 if ($attr->has_type_constraint) {
27 my $type_name = $attr->type_constraint->name;
28 if (MooseX::Getopt::OptionTypes->has_option_type($type_name)) {
29 $name .= MooseX::Getopt::OptionTypes->get_option_type($type_name);
30 }
31 }
32
33 $options{$name} = \($constructor_options{$init_arg});
34 }
35
36 GetOptions(%options);
37
38 # filter out options which
39 # were not passed at all
40 %constructor_options = map {
41 $constructor_options{$_} ne ''
42 ? ($_ => $constructor_options{$_})
43 : ()
44 } keys %constructor_options;
45
46 $class->new(%params, %constructor_options);
47}
48
491;
50
51__END__
52
53=pod
54
55=head1 NAME
56
57MooseX::Getopt -
58
59=head1 SYNOPSIS
60
61 ## In your class
62 package My::App;
63 use Moose;
64
65 with 'MooseX::Getopt';
66
67 has 'out' => (is => 'rw', isa => 'Str', required => 1);
68 has 'in' => (is => 'rw', isa => 'Str', required => 1);
69
70 # ... rest of the class here
71
72 ## in your script
73 #!/usr/bin/perl
74
75 use My::App;
76
77 my $app = My::App->new_with_options();
78 # ... rest of the script here
79
80 ## on the command line
81 % perl my_app_script.pl -in file.input -out file.dump
82
83=head1 DESCRIPTION
84
85=head1 METHODS
86
87=over 4
88
89=item B<new_with_options (%params)>
90
91=item B<meta>
92
93=back
94
95=head1 BUGS
96
97All complex software has bugs lurking in it, and this module is no
98exception. If you find a bug please either email me, or add the bug
99to cpan-RT.
100
101=head1 AUTHOR
102
103Stevan Little E<lt>stevan@iinteractive.comE<gt>
104
105=head1 COPYRIGHT AND LICENSE
106
107Copyright 2007 by Infinity Interactive, Inc.
108
109L<http://www.iinteractive.com>
110
111This library is free software; you can redistribute it and/or modify
112it under the same terms as Perl itself.
113
114=cut