# from Ricardo SIGNES
# on Monday 09 April 2007 05:10 am:
>I need to finish/test/release my PC subclass that looks at
>@PKG::POD_COVERAGE_TRUSTME.
I saw that in rt, but I really think pod is the place for it. Why
clutter the code with variables which are only used by a tool that
reads pod? Isn't that what '=for' is for?
>I am definitely not happy with the idea
> of letting Pod::Coverage just look for subs declared with "sub name"
> as you suggest. I generate too many methods dynamically.
Well, we could have *that* debate, but I'm inclined to think that a
project should get to choose between them (at least in terms of what's
the policy for whether the code is ship-ready.) I'm firmly on the
"human decisions supported by tools" side of the fence.
We don't really have the option to generate pod dynamically (at least,
not outside of the build system), so I tend to document the
autogenerated methods as:
=head2 menu_view_tab_<foo>
Activates the <foo> sidebar tab.
=cut
And I might include every method in that bit of documentation, but I'm
not going to =head2 or even =item them.
With a symbol-table walking scheme, I now have to add an explicit or
regexp list of trustme's to match that. With a static scan, I don't
have to do anything.
What was bugging me about the symtable walk was stuff like:
# override this because the default behavior makes no sense
sub SetFocus {shift->focus_current(@_);}
In My Policy, that doesn't belong in the pod documentation because it is
an implementation detail. It might get a mention in the focus_current
pod, but again, will not get an =head[2-4] or =item. Being able to say
"trust me" with a leading space or semicolon seems like a rather useful
convention.
Of course, there's also "the code can not be loaded" (e.g. on this
computer - whether lack of prereqs, failure to be linux, etc.) I guess
failure to die when eval("require $package") fails is a bug? ATM,
Test::Pod::Coverage says "ok" there, but I'm not sure who's bug it is.
Shouldn't that at least be a "skipped: $module failed to load"?
The pod is static, so with all of the problems of compiling the code,
plus the speed difference, it seems like this is one case where
simplistic static code scanning is a net win for some. Just like
kwalitee, it is not a perfect metric, but I think it makes a good tool.
Symbol Table Walk:
* picks-up on magic subs (iff the magic is in your package.)
(skips accessors, constants, etc.)
* requires explicit trustme/private declarations
* requires that the code compiles on the current machine/platform
* is slow
Static Code Scanning:
* only sees statically declared subs
* ignores anything which doesn't m/^sub [A-Za-z]\w+/
(sort of a 'defaults to "trustme"' style)
* is unaffected by dependency/platform issues
* is quick
Which of those items are pros or cons mostly depends on your POV. It
seems like there's a good case for one or the other in given
situations. I might use the STW as an occasional audit, but have the
SCS as the check on the nightly build. I tend to have my eyes on the
code enough to see blatant violations, so I'm looking to catch errors
which look correct such as:
=head2 foo_bar_bat
Does the bar to foo's baz.
=cut
sub foo_bar_baz {
...
What perplexes me is I guess: why have we only had the one scheme for so
long? I caught a couple of actual mis-documented bits (such as above)
with the SCS, but the STW always made so much noise that I had
basically just given up on making it work until yesterday. I wonder
how many others have similarly thrown up their hands and just walked
away from pod coverage because of that?
In my case, the SCS is much more pragmatic in that it allows me to catch
honest errors, whereas the STW punishes my tendency to not repeat
myself, plus takes longer *and* misses checking all of the
windows-specific code.
--Eric
--
"Unthinking respect for authority is the greatest enemy of truth."
--Albert Einstein
---------------------------------------------------
http://scratchcomputing.com
---------------------------------------------------