* Perltidy.
[gitmo/MooseX-Getopt.git] / lib / MooseX / Getopt / Parser / Long.pm
1
2 package MooseX::Getopt::Parser::Long;
3
4 use Moose;
5
6 with 'MooseX::Getopt::Parser';
7
8 use MooseX::Getopt::OptionTypeMap;
9
10 use Getopt::Long ();
11
12
13 # Special configuration for parser
14 has config => (
15     is         => 'rw',
16     isa        => 'ArrayRef[Str]',
17     auto_deref => 1,
18     default    => sub { ['default'] },
19 );
20
21
22 sub build_options {
23     my $self = shift;
24     my ( $getopt, @attrs ) = @_;
25
26     Moose->throw_error("First argument is not a MooseX::Getopt::Session")
27         unless $getopt->isa('MooseX::Getopt::Session');
28
29     my $options     = $getopt->options;
30     my $new_options = { %$options };
31
32     my @opts;
33
34     foreach my $attr (@attrs) {
35         my $name = $attr->name;
36
37         my ( $flag, @aliases ) = $getopt->_get_cmd_flags_for_attr($attr);
38         my $type = $getopt->_get_cmd_type_for_attr($attr);
39
40         my $opt_string = join '|', $flag, @aliases;
41         $opt_string .= MooseX::Getopt::OptionTypeMap->get_option_type($type)
42             if $type;
43
44         $new_options->{$name} = undef;
45         push @opts, $opt_string => \$new_options->{$name};
46     };
47
48     my $warnings = '';
49
50     GETOPT: {
51         my $parser = new Getopt::Long::Parser;
52         $parser->configure( $self->config );
53
54         local @ARGV = @{ $getopt->ARGV };
55
56         local $SIG{__WARN__} = sub {
57             $warnings .= $_[0];
58         };
59
60         $parser->getoptions( @opts );
61
62         my $extra_argv = \@ARGV;
63         $getopt->extra_argv( $extra_argv );
64     };
65
66     # Filter not defined values in new_options hashref
67     $new_options = {
68         map { $_ => $new_options->{$_} }
69             grep { defined $new_options->{$_} } keys %$new_options
70     };
71
72     $getopt->status( ! $warnings );
73     $getopt->options( $new_options );
74
75     die $warnings if $warnings;
76
77     return $new_options;
78 };
79
80
81 1;
82
83
84 __END__
85
86 =pod
87
88 =head1 NAME
89
90 MooseX::Getopt::Parser::Long - A Getopt::Long parser for MooseX::Getopt
91
92 =head1 SYNOPSIS
93
94   use MooseX::Getopt::Parser::Long;
95
96   my $parser = MooseX::Getopt::Parser::Long->new( config => ['pass_through'] );
97   my $getopt = MooseX::Getopt::Session->new( parser => $parser );
98   my $app = My::App->new( getopt => $getopt );
99
100 =head1 DESCRIPTION
101
102 This class does L<MooseX::Getopt::Parser> for L<MooseX::Getopt>.  This
103 class is used by default if L<Getopt::Long::Descriptive> module is
104 missing.
105
106 =head1 METHODS
107
108 =over 4
109
110 =item B<build_options ($getopt, @attrs)>
111
112 This method parses the CLI options with L<Getopt::Long> and returns a hashref to options list.
113
114 The first argument have to be L<MooseX::Getopt::Session> object and
115 second argument is a list of attributes which contains options.
116
117 =item B<config>
118
119 This accessor contains the arrayref to list with special configuration
120 keywords for L<Getopt::Long>.
121
122 =back
123
124 =head1 BUGS
125
126 All complex software has bugs lurking in it, and this module is no
127 exception. If you find a bug please either email me, or add the bug
128 to cpan-RT.
129
130 =head1 SEE ALSO
131
132 =over 4
133
134 =item L<MooseX::Getopt::Parser>
135
136 =item L<MooseX::Getopt::Parser::Default>
137
138 =item L<MooseX::Getopt::Parser::Descriptive>
139
140 =item L<Getopt::Long>
141
142 =back
143
144 =head1 AUTHOR
145
146 Piotr Roszatycki, E<lt>dexter@cpan.orgE<gt>
147
148 =head1 COPYRIGHT AND LICENSE
149
150 Copyright 2007-2008 by Infinity Interactive, Inc.
151
152 L<http://www.iinteractive.com>
153
154 This library is free software; you can redistribute it and/or modify
155 it under the same terms as Perl itself.
156
157 =cut