Login
Fixed POD bummers
[gknop/Perl-Critic.git] / TODO.pod
1 =head1
2
3     #######################################################################
4     #      $URL$
5     #     $Date$
6     #   $Author$
7     # $Revision$
8     #######################################################################
9
10 =head1 NEW FEATURES
11
12 =over 4
13
14 =item * Report safari sections instead of book page numbers.
15
16 =back
17
18 =head1 BUGS/LIMITATIONS
19
20 =over 4
21
22 =item * Errors in .perlcriticrc are silent
23
24 =item * Modules::RequireVersionVar
25
26 Doesn't enforce three-part versions
27
28 =item * NamingConventions::ProhibitAmbiguousNames
29
30 Don't allow compound names with forbidden words, like "last_record".
31 Allow forbidden words in RHS of variable declarations
32
33 =item * Subroutines::ProtectPrivateSubs
34
35 Doesn't forbid C<< $pkg->_foo() >> because it can't tell the
36 difference between that and C<< $self->_foo() >>
37
38 =back
39
40 =head1 OTHER PBP POLICIES THAT SEEM FEASIBLE TO IMPLEMENT
41
42 =over 4
43
44 =item * ValuesAndExpressions::ProhibitCommaSeparatedStatements (p68)
45
46 =item * ValuesAndExpressions::RequireListParens (p71)
47
48 =item * ValuesAndExpressions::ProhibitScalarGrep (p71)
49
50 Look for grep in a scalar context and recommend any() instead
51
52 =item * Variables::RequireLocalizedPunctuationVars (p81)
53
54 =item * Variables::RequireNegativeIndices (p88)
55
56 =item * Variables::RequireLexicalForLoopIterator (p108)
57
58 =item * Variables::ProhibitTopicChangeInListFunction (p114)
59
60 =item * Documentation::PodSpelling (p148)
61
62 Base it on Pod::Spell or Test::Spelling. Add a "=for stopwords"
63 section for words to skip, as per Pod::Spell.
64
65 =item * BuiltinFunctions::ProhibitReverseSortBlock (p152)
66
67 Don't allow first instance of C<$b> to be before first instance of C<$a>.
68
69 =item * Subroutines::RequireArgUnpacking (p178)
70
71 Ensure that the first child of a sub is PPI::Statement::Variable
72
73 =item * Subroutines::ProhibitManyArgs (p182)
74
75 If first L<PPI::Statement::Variable> is a list C<my>, make sure
76 it's fewer than N elements.  Otherwise make sure there are less
77 than N L<PPI::Statement::Variable>s in a row at begin
78
79 =item * InputOutput::RequireErrorChecking (p208)
80
81 Forbid open, print, close in void context
82
83 =item * InputOutput::RequireBriefOpen (p209)
84
85 Make sure there's a close within N statements of an open, both with
86 same lexical FH
87
88 =item * InputOutput::ProhibitJoinedReadline (p213)
89
90 =item * InputOutput::ProhibitExplicitStdin (p216)
91
92 =item * InputOutput::ProhibitInteractiveTest (p218)
93
94 Forbid -t operand
95
96 =item * Miscellanea::ProhibitObnoxiousComments
97
98 Forbid excessive hash marks e.g. "#### This is a loud comment ####".
99 Make the obnoxious pattern configurable
100
101 =item * RegularExpressions::RequireBracesForMultiline (p242)
102
103 =item * RegularExpressions::ProhibitUnusualDelimiters (p246)
104
105 =item * RegularExpressions::ProhibitEscapedMetacharacters (p247)
106
107 =item * RegularExpressions::ProhibitEnumeratedClasses (p248)
108
109 This will be avoided for ASCII-only code
110
111 =item * RegularExpressions::ProhibitUnusedCapture (p252)
112
113 Look for LHS of regexp or use of C<$1>, C<$2>, ... before next
114 regexp
115
116 =item * RegularExpressions::ProhibitCaptureWithoutTest (p253)
117
118 C<$1>, C<$2>, ... must be inside conditional with no preceding regexp
119
120 =item * RegularExpressions::ProhibitComplexRegexps (p261)
121
122 If regexp is longer than N characters/lines, require it be split
123 into C<qr//> pieces.
124
125 =item * RegularExpressions::ProhibitSingleCharAlternation (p265)
126
127 Not sure if this is easy or hard.  Need to look at what PPI emits
128 for regexps.
129
130 =item * RegularExpressions::ProhibitFixedStringMatches (p271)
131
132 Can't be C<qr/\s*\\A\s*\((?:\?:)?(?:\s*\w+\s*\|)*\s*\w+\s*\)\s*\\z/>
133 or C<qr/\s*\\A\s*\w+\s*\\z/>
134
135 =item * TestingAndDebugging::ProhibitProlongedStrictureOverride (p443)
136
137 =back
138
139 =head1 NON-PBP POLICIES WANTED
140
141 =over 4
142
143 =item * BuiltInFunctions::RequireConstantSprintfFormat
144
145 =item * BuiltInFunctions::RequireConstantUnpackFormat
146
147 L<http://home.earthlink.net/~josh.jore/new-warnings/slides/slide1.html>
148
149 =item * ControlStructures::ProhibitIncludeViaDo
150
151 Forbid C<do "foo.pl">.  Not sure about this policy name.
152
153 =item * CodingStyle::ProhibitNonASCII
154
155 Definitely low severity!  Only looks at code, not comments or POD
156
157 =item * Miscellanea::RequireMinimumPerlVersion
158
159 Every module should have something like C<use 5.6.0>
160
161 =item * Miscellanea::Prohibit5006isms
162
163 Keep the code 5.005 compatible Low severity
164
165 =item * Variables::ProhibitUseVars
166
167 Require C<our $foo> instead.  This contradicts
168 Miscellanea::Prohibit5006isms.  Maybe verify C<use 5.6> before
169 applying this policy.  Low severity.
170
171 =item * VariablesAndExpressions::ProhibitQuotedHashKeys
172
173 Forbid quotes around hash keys, unless they are really needed.  This
174 is against what Damian says.  Suggested by Adam Kennedy.  Low
175 severity.
176
177 =item * Miscellanea::B::Lint
178
179 Create a compatibility layer for the L<B::Lint> code analyzer.  Make
180 it very clear that this runs code and thus is a security hole.
181
182 =item * CodingStyle::ProhibitFunctionalNew
183
184 Good: C<< Foo::Bar->new >>, Bad: C<< new Foo::Bar >>
185
186 =item * VariablesAndExpressions::RequireConstantVersion (low severity)
187
188 VariablesAndExpressions::ProhibitComplexVersion (medium severity)
189 L<http://rt.cpan.org/Ticket/Display.html?id=20439>
190
191 =item * ProhibitStringSplit
192
193 Since C<split("x", $whatever)> is translated to C<split(/x/, $whatever)>,
194 you might as well write it that way anyway.  It will help people
195 remember.  I don't know how many times I've seen someone perplexed
196 by C<split("|", $something)> not working.
197
198 However, there is at least one exception, and if you write such a
199 rule, you should take this special case into account:
200
201     $ perl -le 'print map {"<$_>"} split q{ }, " Romeo and Juliet "'
202     <Romeo><and><Juliet>
203     $ perl -le 'print map {"<$_>"} split / /, " Romeo and Juliet "'
204     <><Romeo><and><Juliet>
205
206 Quoting from L<http://perldoc.perl.org/functions/split.html>
207
208     As a special case, specifying a PATTERN of space (' ') will split
209     on white space just as split with no arguments does.  Thus,
210     split(' ') can be used to emulate awk's default behavior, whereas
211     split(/ /) will give you as many null initial fields as there
212     are leading spaces.
213
214 See also L<http://www.perlmonks.org/?node_id=287545>
215
216 =back
217
218 =head1 REFACTORINGS and ENHANCEMENTS
219
220 =over 4
221
222 =item * Move %FORMATS from `perlcritic` into Perl::Critic::Utils so that
223
224 Test::P::C can use them.  Use a subroutine instead of a package var.
225
226 =item * Alias -verbose to -format option in Test::P::C.
227
228 Give it same functionality as the -verbose option in `perlcritic`
229
230 =item * Enhance P::C::critique() to accept file names, directories, or code strings (as refs) just like `perlcritic` does now.
231
232 =back