<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Elliot Loves Perl</title>
	<atom:link href="http://elliotlovesperl.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://elliotlovesperl.com</link>
	<description>A boy and his language</description>
	<lastBuildDate>Wed, 17 Feb 2010 12:43:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='elliotlovesperl.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Elliot Loves Perl</title>
		<link>http://elliotlovesperl.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://elliotlovesperl.com/osd.xml" title="Elliot Loves Perl" />
	<atom:link rel='hub' href='http://elliotlovesperl.com/?pushpress=hub'/>
		<item>
		<title>Test Moose accessors? Hell, yes.</title>
		<link>http://elliotlovesperl.com/2010/02/16/test-moose-accessors-hell-yes/</link>
		<comments>http://elliotlovesperl.com/2010/02/16/test-moose-accessors-hell-yes/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 02:36:13 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Test::Moose]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=158</guid>
		<description><![CDATA[I&#8217;m sorry Dave, but you&#8217;re wrong, wrong, wrong! :] The purpose of testing &#8220;attributes&#8221; is not to test that Moose did its thing. The purpose of testing attributes&#8217; accessors is that they are part of your class&#8217; interface. That an accessor is backed by a Moose attribute is an implementation detail. Just because get_foo() is [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=158&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m sorry Dave, but <a href="http://blog.urth.org/2010/02/the-purpose-of-automated-tests.html">you&#8217;re wrong, wrong, wrong</a>! :]</p>
<p>
The purpose of testing &#8220;attributes&#8221; is not to test that Moose did its thing.  The purpose of testing attributes&#8217; accessors is that they are part of your class&#8217; interface.  That an accessor is backed by a Moose attribute is an implementation detail.  Just because <code>get_foo()</code> is an attribute accessor today doesn&#8217;t mean that the data won&#8217;t be stored elsewhere in the future or even be derived from something else.</p>
<p>
What you shouldn&#8217;t be doing is using <code>has_attribute_ok()</code> from Test::Moose, again because where the data returned by the accessor is coming from shouldn&#8217;t matter to users of your class.</p>
<br /> Tagged: <a href='http://elliotlovesperl.com/tag/development/'>development</a>, <a href='http://elliotlovesperl.com/tag/moose/'>Moose</a>, <a href='http://elliotlovesperl.com/tag/testmoose/'>Test::Moose</a>, <a href='http://elliotlovesperl.com/tag/testing/'>testing</a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/158/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/158/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/158/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=158&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2010/02/16/test-moose-accessors-hell-yes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Don&#8217;t put Perl::Critic into source control pre-commit hooks.</title>
		<link>http://elliotlovesperl.com/2009/12/27/dont-put-perlcritic-into-source-control-pre-commit-hooks/</link>
		<comments>http://elliotlovesperl.com/2009/12/27/dont-put-perlcritic-into-source-control-pre-commit-hooks/#comments</comments>
		<pubDate>Sun, 27 Dec 2009 16:30:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=156</guid>
		<description><![CDATA[Some people seem to like to put Perl::Critic tests into their VCS pre-commit hooks in order to prevent code with violations being checked in. I consider this to be a really bad idea. You should always be able to check your code in, if only for backup purposes. It&#8217;s a matter of preserving your code, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=156&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Some people seem to like to put <a href="http://alexander-simakov.blogspot.com/2009/12/using-perlcritic-in-subversion-hook.html">Perl::Critic tests into their VCS pre-commit hooks</a> in order to prevent code with violations being checked in.  I consider this to be a really bad idea.  You should always be able to check your code in, if only for backup purposes.  It&#8217;s a matter of preserving your code, even if it&#8217;s got some stupid <a href="http://search.cpan.org/perldoc?Perl::Critic::Policy::Documentation::PodSpelling">PodSpelling</a> violation.  You&#8217;ve got a production emergency bug fix and you can&#8217;t check in because you&#8217;ve got a <a href="http://search.cpan.org/perldoc?Perl::Critic::Policy::RegularExpressions::ProhibitEscapedMetacharacters">ProhibitEscapedMetacharacters</a> problem?  I certainly wouldn&#8217;t want that.</p>
<br /> Tagged: development, Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/156/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/156/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/156/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=156&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/12/27/dont-put-perlcritic-into-source-control-pre-commit-hooks/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>No Devel::Declare. Ever.</title>
		<link>http://elliotlovesperl.com/2009/12/17/no-develdeclare-ever/</link>
		<comments>http://elliotlovesperl.com/2009/12/17/no-develdeclare-ever/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 16:29:49 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[syntax]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=154</guid>
		<description><![CDATA[I think Devel::Declare is evil for the same reasons that Adam does. Even if PPI supports it, Perl::Critic will not be supporting any syntax that&#8217;s not part of the language core. Not only because it would be necessary to figure out semantics, but because I oppose balkanization of the language. To quote myself: &#8220;Please add [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=154&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I think Devel::Declare is evil for the same reasons that <a href="http://use.perl.org/~Alias/journal/40026">Adam does</a>.</p>
<p>Even if PPI supports it, Perl::Critic will not be supporting any syntax that&#8217;s not part of the language core.  Not only because it would be necessary to figure out semantics, but because I oppose balkanization of the language.</p>
<p>To quote myself: &#8220;<a href="http://twitter.com/clonezone/status/1922353774"><em>Please</em> add a &#8216;class. keyword. Would that break MooseX::Declare? Yup. Tough cookies.</a>&#8220;</p>
<br /> Tagged: Perl::Critic, syntax <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/154/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/154/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/154/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=154&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/12/17/no-develdeclare-ever/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>If it&#8217;s broken, fix it — dammit.</title>
		<link>http://elliotlovesperl.com/2009/11/28/if-its-broken-fix-it-%e2%80%94-dammit/</link>
		<comments>http://elliotlovesperl.com/2009/11/28/if-its-broken-fix-it-%e2%80%94-dammit/#comments</comments>
		<pubDate>Sat, 28 Nov 2009 18:56:33 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[maintenance]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=152</guid>
		<description><![CDATA[I was reminded of the epigram &#8220;If it&#8217;s broken, don&#8217;t fix it.&#8221;. My problem with this is that people don&#8217;t apply the contrapositive. So many just leave things that don&#8217;t work around, and that plain sucks. Don&#8217;t suffer brokenness. Fix it. Tagged: development, maintenance<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=152&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was <a href="http://szabgab.com/blog/2009/11/1259431123.html">reminded</a> of the epigram &#8220;If it&#8217;s broken, don&#8217;t fix it.&#8221;. My problem with this is that people don&#8217;t apply the contrapositive. So many just leave things that don&#8217;t work around, and that plain sucks.</p>
<p>Don&#8217;t suffer brokenness. Fix it.</p>
<br /> Tagged: development, maintenance <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/152/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=152&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/11/28/if-its-broken-fix-it-%e2%80%94-dammit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Explicitly running author tests.</title>
		<link>http://elliotlovesperl.com/2009/11/24/explicitly-running-author-tests/</link>
		<comments>http://elliotlovesperl.com/2009/11/24/explicitly-running-author-tests/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 20:23:44 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CPAN module support]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=150</guid>
		<description><![CDATA[There are tests that you want to have around, but not be part of the standard test run prior to installation of a distribution. Probably the biggest set of these in publicly available Perl distributions is &#8220;author&#8221; tests (manifest checks, code and POD coverage, etc.), but there are other things such as live database tests [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=150&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>There are tests that you want to have around, but not be part of the standard test run prior to installation of a distribution.  Probably the biggest set of these in publicly available Perl distributions is &#8220;author&#8221; tests (manifest checks, code and POD coverage, etc.), but there are other things such as live database tests that should not block installation.  The most common way of disabling tests is via checking an environment variable in a test file:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">1 </font><font color="#f0e68c"><b>if</b></font>&nbsp;( <font color="#f0e68c"><b>not</b></font>&nbsp;<font color="#98fb98">$ENV</font>{TEST_AUTHOR}) {<br />
<font color="#ff0">2 </font>&nbsp;&nbsp;&nbsp;&nbsp;plan <font color="#ffa0a0">skip_all </font>=&gt; <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">Author test. Set $ENV{TEST_AUTHOR} to a true value to run.</font><font color="#ffa0a0">&#8216;</font>;<br />
<font color="#ff0">3 </font>}<br />
</font>
</div>
<p>On the Perl::Critic project, we ran into problems with this.  We got failures when people had the environment variable set for their own purposes.  The code that checked for enabling author tests also turned them on if there was a <code>.svn</code> directory around, so, of course, we got a complaint when someone grabbed the source from the Perl::Critic repository. *sigh*</p>
<p>The proper way to enable author tests is to require the user to explicitly say that she wants them to be run.</p>
<p>The first thing to do is to segregate the non-standard tests from the regular ones so that the standard testing tools don&#8217;t run them by default.  At the 2008 QA hackathon in Oslo it was decided that these tests belong under the &#8220;xt&#8221; directory in a distribution; there was no mandate about substructure.  I&#8217;ve been using &#8220;xt/author&#8221; for my author tests.</p>
<p>The second step is to create a &#8220;authortest&#8221; build target.  Since I use <a href="http://search.cpan.org/perldoc/Module::Build">Module::Build</a> as my build tool, this example will use that.  The way to create a custom target in Module::Build is to create a method on a Module::Build subclass with a name that starts with &#8220;ACTION_&#8221;.  Here&#8217;s my standard &#8220;authortest&#8221; code:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">&nbsp;1 </font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font><font color="#98fb98">ACTION_authortest </font>{<br />
<font color="#ff0">&nbsp;2 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;(<font color="#98fb98">$self</font>) = <font color="#98fb98">@_</font>;<br />
<font color="#ff0">&nbsp;3 </font><br />
<font color="#ff0">&nbsp;4 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;depends_on(<font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">build</font><font color="#ffa0a0">&#8216;</font>);<br />
<font color="#ff0">&nbsp;5 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;depends_on(<font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">manifest</font><font color="#ffa0a0">&#8216;</font>);<br />
<font color="#ff0">&nbsp;6 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;depends_on(<font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">distmeta</font><font color="#ffa0a0">&#8216;</font>);<br />
<font color="#ff0">&nbsp;7 </font><br />
<font color="#ff0">&nbsp;8 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;test_files( <font color="#ffa0a0">qw&lt;</font><font color="#ffa0a0">&nbsp;t xt/author </font><font color="#ffa0a0">&gt;</font>&nbsp;);<br />
<font color="#ff0">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;recursive_test_files(<font color="#ffa0a0">1</font>);<br />
<font color="#ff0">10 </font><br />
<font color="#ff0">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;depends_on(<font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">test</font><font color="#ffa0a0">&#8216;</font>);<br />
<font color="#ff0">12 </font><br />
<font color="#ff0">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>return</b></font>;<br />
<font color="#ff0">14 </font>}<br />
</font>
</div>
<p>First this asks Module::Build to ensure that the build, manifest, and distmeta actions have been run because some of the tests depend upon the MANIFEST and META.yml files being around and I don&#8217;t check those into source control.  Line 8 tells Module::Build to look in the standard &#8220;t&#8221; directory plus &#8220;xt/author&#8221; for tests.  Line 9 says that the test files may not be directly in these subdirectories.  Finally, it asks for the regular test action to be run.</p>
<p>Using this, running the standard &#8220;<code>./Build test</code>&#8221; command doesn&#8217;t run author tests, no matter what the user&#8217;s environment is.  And simply running &#8220;<code>./Build authortest</code>&#8221; causes all the tests to run.  Simple, yet explicit.</p>
<p>To ensure that nothing gets released without the author tests being run, I change the distdir action to require the author tests be run:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">1 </font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font><font color="#98fb98">ACTION_distdir </font>{<br />
<font color="#ff0">2 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;(<font color="#98fb98">$self</font>) = <font color="#98fb98">@_</font>;<br />
<font color="#ff0">3 </font><br />
<font color="#ff0">4 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fb98">$self</font>-&gt;depends_on(<font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">authortest</font><font color="#ffa0a0">&#8216;</font>);<br />
<font color="#ff0">5 </font><br />
<font color="#ff0">6 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>return</b></font>&nbsp;<font color="#98fb98">$self</font>-&gt;SUPER::ACTION_distdir();<br />
<font color="#ff0">7 </font>}<br />
</font>
</div>
<br /> Tagged: CPAN module support, testing <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/150/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/150/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/150/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=150&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/11/24/explicitly-running-author-tests/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>How to structure Perl programs.</title>
		<link>http://elliotlovesperl.com/2009/11/23/how-to-structure-perl-programs/</link>
		<comments>http://elliotlovesperl.com/2009/11/23/how-to-structure-perl-programs/#comments</comments>
		<pubDate>Mon, 23 Nov 2009 20:15:51 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[coding style]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[programs]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=148</guid>
		<description><![CDATA[Don&#8217;t put the implementation of your program in your program; put it in a module instead. There are at least three reasons for doing things this way: Your code is more testable. You can feed in arbitrary command lines and check the exit code. Your code is reusable. If you need to use your program [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=148&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Don&#8217;t put the implementation of your program in your program; put it in a module instead.  There are at least three reasons for doing things this way:</p>
<ul>
<li>Your code is more testable.  You can feed in arbitrary command lines and check the exit code.</li>
<li>Your code is reusable.  If you need to use your program from another Perl program, there&#8217;s no need to use <code>system</code>, backticks, or <a href="http://search.cpan.org/perldoc/IPC::System::Simple">IPC::System::Simple</a>, just <code>use</code> your module and call the implementing subroutine.</li>
<li>Your programs can be better managed by the standard Perl toolchain.  Program versions are not checked by CPAN, et. al. so if you create a new version of an existing program, it won&#8217;t be upgraded.  If all of your code is in a module, then version changes will cause updates to be installed.</li>
</ul>
<p>A simple way of doing this would be to have a module that looks like</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">&nbsp;1 </font><font color="#f0e68c"><b>package</b></font><font color="#bdb76b"><b>&nbsp;ProgramImplementation;</b></font><br />
<font color="#ff0">&nbsp;2 </font><br />
<font color="#ff0">&nbsp;3 </font><font color="#f0e68c"><b>use utf8</b></font>;<br />
<font color="#ff0">&nbsp;4 </font><font color="#f0e68c"><b>use </b></font><font color="#ffa0a0">5.010</font>;<br />
<font color="#ff0">&nbsp;5 </font><br />
<font color="#ff0">&nbsp;6 </font><font color="#f0e68c"><b>use strict</b></font>;<br />
<font color="#ff0">&nbsp;7 </font><font color="#f0e68c"><b>use warnings</b></font>;<br />
<font color="#ff0">&nbsp;8 </font><br />
<font color="#ff0">&nbsp;9 </font><font color="#f0e68c"><b>use </b></font>Exporter <font color="#ffa0a0">qw&lt;</font><font color="#ffa0a0">&nbsp;import </font><font color="#ffa0a0">&gt;</font>;<br />
<font color="#ff0">10 </font><br />
<font color="#ff0">11 </font><font color="#f0e68c"><b>our</b></font>&nbsp;<font color="#98fb98">@EXPORT_OK</font>&nbsp;= <font color="#ffa0a0">qw&lt;</font><font color="#ffa0a0">&nbsp;run </font><font color="#ffa0a0">&gt;</font>;<br />
<font color="#ff0">12 </font><br />
<font color="#ff0">13 </font><br />
<font color="#ff0">14 </font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font><font color="#98fb98">run </font>{<br />
<font color="#ff0">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;(<font color="#98fb98">@argv</font>) = <font color="#98fb98">@_</font>;<br />
<font color="#ff0">16 </font><br />
<font color="#ff0">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
<font color="#ff0">18 </font><br />
<font color="#ff0">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>return</b></font>&nbsp;<font color="#ffa0a0">0</font>;<br />
<font color="#ff0">20 </font>}<br />
<font color="#ff0">21 </font><br />
<font color="#ff0">22 </font><font color="#ffa0a0">1</font>;<br />
</font>
</div>
<p>and then use that like this:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">&nbsp;1 </font><font color="#f0e68c"><b>use utf8</b></font>;<br />
<font color="#ff0">&nbsp;2 </font><font color="#f0e68c"><b>use </b></font><font color="#ffa0a0">5.010</font>;<br />
<font color="#ff0">&nbsp;3 </font><br />
<font color="#ff0">&nbsp;4 </font><font color="#f0e68c"><b>use strict</b></font>;<br />
<font color="#ff0">&nbsp;5 </font><font color="#f0e68c"><b>use warnings</b></font>;<br />
<font color="#ff0">&nbsp;6 </font><br />
<font color="#ff0">&nbsp;7 </font><font color="#f0e68c"><b>use </b></font>ProgramImplementation <font color="#ffa0a0">qw&lt;</font><font color="#ffa0a0">&nbsp;run </font><font color="#ffa0a0">&gt;</font>;<br />
<font color="#ff0">&nbsp;8 </font><br />
<font color="#ff0">&nbsp;9 </font><font color="#f0e68c"><b>return</b></font>&nbsp;<font color="#ffa0a0">1</font>&nbsp;<font color="#f0e68c"><b>if</b></font>&nbsp;<font color="#f0e68c"><b>caller</b></font>;<br />
<font color="#ff0">10 </font><font color="#f0e68c"><b>exit</b></font>&nbsp;run(<font color="#98fb98">@ARGV</font>);<br />
</font>
</div>
<p>Having the &#8220;<code>return 1 if caller</code>&#8221; in there means that the program can be <code>require</code>d without causing the requiring program to exit.  (Whether you ought to actually do that is another matter.)</p>
<p>If you want things to be even more reusable, make your program implementation an object with attributes for the standard file handles:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">&nbsp;1 </font><font color="#f0e68c"><b>package</b></font><font color="#bdb76b"><b>&nbsp;ObjectProgramImplementation;</b></font><br />
<font color="#ff0">&nbsp;2 </font><br />
<font color="#ff0">&nbsp;3 </font><font color="#f0e68c"><b>use utf8</b></font>;<br />
<font color="#ff0">&nbsp;4 </font><font color="#f0e68c"><b>use </b></font><font color="#ffa0a0">5.010</font>;<br />
<font color="#ff0">&nbsp;5 </font><br />
<font color="#ff0">&nbsp;6 </font><font color="#f0e68c"><b>use </b></font>Moose;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#87ceeb"># Or your favorite object module.</font><br />
<font color="#ff0">&nbsp;7 </font><br />
<font color="#ff0">&nbsp;8 </font>has <font color="#ffa0a0">stdout </font>=&gt; (<br />
<font color="#ff0">&nbsp;9 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffa0a0">isa </font>=&gt; <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">FileHandle</font><font color="#ffa0a0">&#8216;</font>,<br />
<font color="#ff0">10 </font>&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
<font color="#ff0">11 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffa0a0">default </font>=&gt;<font color="#98fb98">&nbsp;</font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font>{ \*STDOUT },<br />
<font color="#ff0">12 </font>);<br />
<font color="#ff0">13 </font><br />
<font color="#ff0">14 </font>has <font color="#ffa0a0">stderr </font>=&gt; (<br />
<font color="#ff0">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffa0a0">isa </font>=&gt; <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">FileHandle</font><font color="#ffa0a0">&#8216;</font>,<br />
<font color="#ff0">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
<font color="#ff0">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ffa0a0">default </font>=&gt;<font color="#98fb98">&nbsp;</font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font>{ \*STDERR },<br />
<font color="#ff0">18 </font>);<br />
<font color="#ff0">19 </font><br />
<font color="#ff0">20 </font><br />
<font color="#ff0">21 </font><font color="#f0e68c"><b>sub</b></font><font color="#98fb98">&nbsp;</font><font color="#98fb98">run </font>{<br />
<font color="#ff0">22 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;(<font color="#98fb98">$self</font>, <font color="#98fb98">@argv</font>) = <font color="#98fb98">@_</font>;<br />
<font color="#ff0">23 </font><br />
<font color="#ff0">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;say { <font color="#98fb98">$self</font>-&gt;stdout() } <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">Hello there!</font><font color="#ffa0a0">&#8216;</font>;<br />
<font color="#ff0">25 </font>&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br />
<font color="#ff0">26 </font><br />
<font color="#ff0">27 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68c"><b>return</b></font>&nbsp;<font color="#ffa0a0">0</font>;<br />
<font color="#ff0">28 </font>}<br />
<font color="#ff0">29 </font><br />
<font color="#ff0">30 </font><font color="#ffa0a0">1</font>;<br />
</font>
</div>
<p>Your regular program would then look like this:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ff0">&nbsp;1 </font><font color="#f0e68c"><b>use utf8</b></font>;<br />
<font color="#ff0">&nbsp;2 </font><font color="#f0e68c"><b>use </b></font><font color="#ffa0a0">5.010</font>;<br />
<font color="#ff0">&nbsp;3 </font><br />
<font color="#ff0">&nbsp;4 </font><font color="#f0e68c"><b>use strict</b></font>;<br />
<font color="#ff0">&nbsp;5 </font><font color="#f0e68c"><b>use warnings</b></font>;<br />
<font color="#ff0">&nbsp;6 </font><br />
<font color="#ff0">&nbsp;7 </font><font color="#f0e68c"><b>use </b></font>ObjectProgramImplementation <font color="#ffa0a0">qw&lt;</font><font color="#ffa0a0">&nbsp;</font><font color="#ffa0a0">&gt;</font>;<br />
<font color="#ff0">&nbsp;8 </font><br />
<font color="#ff0">&nbsp;9 </font><font color="#f0e68c"><b>return</b></font>&nbsp;<font color="#ffa0a0">1</font>&nbsp;<font color="#f0e68c"><b>if</b></font>&nbsp;<font color="#f0e68c"><b>caller</b></font>;<br />
<font color="#ff0">10 </font><font color="#f0e68c"><b>exit</b></font>&nbsp;ObjectProgramImplementation-&gt;<font color="#f0e68c"><b>new</b></font>()-&gt;run(<font color="#98fb98">@ARGV</font>);<br />
</font>
</div>
<p>But you can have other uses like</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><br />
<font color="#ffff00">&nbsp;1 </font><font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$stdout</font>;<br />
<font color="#ffff00">&nbsp;2 </font><font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$stderr</font>;<br />
<font color="#ffff00">&nbsp;3 </font><font color="#f0e68c"><b>open</b></font>&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$stdout_handle</font>, <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">&gt;</font><font color="#ffa0a0">&#8216;</font>, <font color="#98fb98">\$stdout</font>;<br />
<font color="#ffff00">&nbsp;4 </font><font color="#f0e68c"><b>open</b></font>&nbsp;<font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$stderr_handle</font>, <font color="#ffa0a0">&#8216;</font><font color="#ffa0a0">&gt;</font><font color="#ffa0a0">&#8216;</font>, <font color="#98fb98">\$stderr</font>;<br />
<font color="#ffff00">&nbsp;5 </font><br />
<font color="#ffff00">&nbsp;6 </font><font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$program</font>&nbsp;=<br />
<font color="#ffff00">&nbsp;7 </font>&nbsp;&nbsp;&nbsp;&nbsp;ObjectProgramImplementation-&gt;<font color="#f0e68c"><b>new</b></font>(<font color="#ffa0a0">stdout </font>=&gt; <font color="#98fb98">$stdout</font>, <font color="#ffa0a0">stderr </font>=&gt; <font color="#98fb98">$stderr</font>);<br />
<font color="#ffff00">&nbsp;8 </font><font color="#f0e68c"><b>my</b></font>&nbsp;<font color="#98fb98">$exit_code</font>&nbsp;= <font color="#98fb98">$program</font>-&gt;run(<font color="#98fb98">@ARGV</font>);<br />
<font color="#ffff00">&nbsp;9 </font><br />
<font color="#ffff00">10 </font><font color="#87ceeb"># Do something with $stdout/$stderr</font><br />
</font>
</div>
<br /> Tagged: coding style, development, programs <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/148/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/148/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/148/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=148&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/11/23/how-to-structure-perl-programs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Thank you Tom Wyant.</title>
		<link>http://elliotlovesperl.com/2009/08/23/thank-you-tom-wyant/</link>
		<comments>http://elliotlovesperl.com/2009/08/23/thank-you-tom-wyant/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 21:58:40 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=146</guid>
		<description><![CDATA[From the Perl::Critic 1.104 Changes file: This release is dedicated to Tom Wyant in appreciation of the amount of effort he put into the enhancements and bug fixes in this release, for having the patience to wait for the amount of time that it took to get them out, and for overall awesomeness. Thank you, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=146&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>From the Perl::Critic 1.104 Changes file:</p>
<blockquote><p>
This release is dedicated to Tom Wyant in appreciation of the amount of effort he put into the enhancements and bug fixes in this release, for having the patience to wait for the amount of time that it took to get them out, and for overall awesomeness.  Thank you, Tom.
</p></blockquote>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/146/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/146/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/146/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=146&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/08/23/thank-you-tom-wyant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Deprecation.</title>
		<link>http://elliotlovesperl.com/2009/07/26/deprecation/</link>
		<comments>http://elliotlovesperl.com/2009/07/26/deprecation/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 03:36:50 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[perl 5]]></category>
		<category><![CDATA[Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=144</guid>
		<description><![CDATA[In the source repository, there are a number of changes to Perl::Critic that include deprecation of existing functions/methods. One Policy author has asked us to not do the deprecation because it will result in warnings being emitted whenever his Policy is being used. There have been a lot of discussion recently in the Perl community [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=144&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In the source repository, there are a number of changes to Perl::Critic that include deprecation of existing functions/methods.  One Policy author has asked us to not do the deprecation because it will result in warnings being emitted whenever his Policy is being used.</p>
<p>There have been a <a href="http://perl.markmail.org/search/?q=subject%3Adeprecation+date%3A20090501-20090731">lot</a> of <a href="http://www.modernperlbooks.com/mt/2009/07/the-what-does-deprecation-actually-mean-meta-argument.html">discussion</a> recently in the Perl community about what deprecation means.  For me, deprecation means that the interface or functionality will be removed and not sit around in a limbo state for years.</p>
<p>So how do I decide whether to deprecate something?  If something is merely suboptimal, I&#8217;m not going to deprecate it; I&#8217;ll merely change the documentation to discourage its use.  In Perl::Critic, there was the issue of Policy constructors.  For a long time, there was no requirements for the <code>new()</code> method for a given Policy other than it returning a blessed hash.  There are some Policys [sic] outside of the core distribution with <code>new()</code> methods that don&#8217;t call up to the <code>new()</code> method in <code>Perl::Critic::Policy</code>.  There was a point when we really wanted to add a lot of functionality to the constructor, but we couldn&#8217;t because there were Policys that didn&#8217;t call it.  We worked around this by doing what we wanted after the Policy object was constructed.  If you look at the <a href="http://search.cpan.org/perldoc/Perl::Critic::DEVELOPER">developer documentation</a> for Perl::Critic, you&#8217;ll note that it discourages creation of a <code>new()</code> method.</p>
<p>On the other hand, if something is incorrectly designed or is holding up future changes, I&#8217;m going to change it or remove it.  I&#8217;m not going to just work around the issue forever.  I won&#8217;t change it without notifying anyone, however.</p>
<p>I made a mistake with the design of <code>Perl::Critic::Utils::PPI::get_constant_name_element_from_declaring_statement()</code>.  I didn&#8217;t realize that you can actually create multiple values using the <code>constant</code> pragma; Tom Wyant corrected my misconception.  The function returns a single value, so it can&#8217;t correctly handle single statements that declare multiple constants.  Its interface is wrong.  It will be removed in the future.  A suggestion was made to immediately remove it, but we&#8217;ll go through a deprecation cycle first.  We won&#8217;t change things without giving notice.</p>
<p>I think the Policy author&#8217;s question about the warnings comes from the practice of a number of projects of &#8220;deprecating&#8221; something, but never actually removing it.  Sun is a particularly egregious example of this with Java functionality that has been deprecated for more than a decade but still hangs around, allowing people to write new code against an interface that is broken.  If I deprecate something, it will be removed.  The warnings that are emitted allow others to deal with the change before it happens.  If, in the interim, this annoys some users, too bad.  It would be worse if the code just stopped working.</p>
<p>If you have a look at <a href="http://galumph.com/code/">my code page</a>, among the epigrams that you find there is &#8220;If it&#8217;s broken, fix it.&#8221;.  While there has long been the saying of not fixing something that isn&#8217;t broken, I think people don&#8217;t do the opposite enough.  Don&#8217;t suffer breakage.  Don&#8217;t put up with things that are wrong.  Change things that need changing, even if it causes some short-term pain.</p>
<br /> Tagged: development, perl 5, Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/144/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/144/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/144/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=144&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/07/26/deprecation/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>How I use Perl::Critic.</title>
		<link>http://elliotlovesperl.com/2009/07/20/how-i-use-perlcritic/</link>
		<comments>http://elliotlovesperl.com/2009/07/20/how-i-use-perlcritic/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 05:05:46 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=138</guid>
		<description><![CDATA[Under regular development conditions, I rarely use perlcritic. Most of my Perl::Critic usage is via Test::Perl::Critic for new code and Test::Perl::Critic::Progressive for existing code. For code that I release to the CPAN, the Perl::Critic tests are in xt/author so that they don&#8217;t get run as part of normal tests that someone installing the modules runs. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=138&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>
Under regular development conditions, I rarely use <code><a href="http://search.cpan.org/perldoc/perlcritic">perlcritic</a></code>.  Most of my Perl::Critic usage is via <a href="http://search.cpan.org/perldoc/Test::Perl::Critic">Test::Perl::Critic</a> for new code and <a href="http://search.cpan.org/perldoc/Test::Perl::Critic::Progressive">Test::Perl::Critic::Progressive</a> for existing code.
</p>
<p>
For code that I release to the CPAN, the Perl::Critic tests are in <code>xt/author</code> so that they don&#8217;t get run as part of normal tests that someone installing the modules runs.  On someone else&#8217;s system, I don&#8217;t know what Perl::Critic version or add-on sets of policies they have, so those tests may fail there through no fault of my own.
</p>
<p>
For non-public code, the Perl::Critic tests are regular tests that get run with all the rest of the tests.  I can do this because I control the specific version of Perl::Critic that I&#8217;m running and which add-on policies that I&#8217;ve got around.
</p>
<p>
Perl::Critic supports the concept of severity levels for policies and, by default, only applies the most severe ones (severity 5).  I effectively ignore the severities by turning Perl::Critic&#8217;s strictness all the way to 1.  Of course, there are policies that I don&#8217;t agree with or cannot use for practical reasons, so I disable those explicitly.
</p>
<p>
You may have noticed that above I used the word &#8220;tests&#8221; and not &#8220;test&#8221;.  This is because I run Perl::Critic on my tests as well as my &#8220;real&#8221; code.  The set of policies that I use on tests is different than I use on the rest of my code.  Tests have fewer restrictions on them compared to regular code.  So I have a test that applies to the contents of <code>lib</code> and <code>bin</code> using one <code>perlcriticrc</code> file and a seperate test that runs on the content of the <code>t</code> and <code>xt</code> directories with a different <code>perlcriticrc</code>.  For tests, I disable the POD policies and <a href="http://search.cpan.org/perldoc/Perl::Critic::Policy::Subroutines::ProtectPrivateSubs">Subroutines::ProtectPrivateSubs</a> (tests are allowed to peek).  Sometimes I also disable <a href="http://search.cpan.org/perldoc/Perl::Critic::Policy::ValuesAndExpressions::ProhibitMagicNumbers">ValuesAndExpressions::ProhibitMagicNumbers</a>, though I prefer not to.
</p>
<p>
(Perl::Critic actually uses three self-compliance tests: one for the regular code, one for the tests, and one that makes an additional pass over the Perl::Critic::Policy subclasses that places some additional requirements on them.)
</p>
<p>
The sets of add-on policies that I generally use are <a href="http://search.cpan.org/perldoc/Perl::Critic::More">Perl::Critic::More</a>, <a href="http://search.cpan.org/perldoc/Perl::Critic::Bangs">Perl::Critic::Bangs</a>, <a href="http://search.cpan.org/perldoc/Perl::Critic::Swift">Perl::Critic::Swift</a>, and <a href="http://search.cpan.org/perldoc/Perl::Critic::Moose">Perl::Critic::Moose</a>.  I&#8217;m thinking about starting to use <a href="http://search.cpan.org/perldoc/Perl::Critic::Pulp">Perl::Critic::Pulp</a>, but I&#8217;d have to disable about half the policies in there.
</p>
<p>
There are a couple of cases in which I do use <code>perlcritic</code>.
</p>
<p>
First, if I&#8217;m surveying a codebase that is new to me, I will run <code>perlcritic --statistics-only</code> over it in order to get an idea of the state of affairs.
</p>
<p>
Second, presented with a set of code that has a large number of problems that need fixing, after running <code>perlcritic --statistics-only</code> on it, I&#8217;ll pick an individual policy that I want to fix violations of and run <code>perlcritic -s <em>policy name</em></code> on the code.  (The long form of <code>-s</code> is <code>--single-policy</code>.)  I find it easier to fix one kind of problem across all of the files before moving on to another kind of problem than to fix all the problems in one file before moving on to another file.</p>
<br /> Tagged: development, Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/138/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/138/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/138/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=138&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/07/20/how-i-use-perlcritic/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>One thing I&#8217;ve never understood about the perl core: binary compatibility.</title>
		<link>http://elliotlovesperl.com/2009/07/01/one-thing-ive-never-understood-about-the-perl-core-binary-compatibility/</link>
		<comments>http://elliotlovesperl.com/2009/07/01/one-thing-ive-never-understood-about-the-perl-core-binary-compatibility/#comments</comments>
		<pubDate>Thu, 02 Jul 2009 02:12:24 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[maintenance]]></category>
		<category><![CDATA[upgrading]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=134</guid>
		<description><![CDATA[So, I was reading chromatic&#8217;s latest, wherein he links to a p5p post which mentions the whole bit about @INC including multiple point releases in it, which makes having them around expensive. In case you didn&#8217;t know it, you can install perl point releases in the same directory and the default @INC will include all [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=134&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>So, I was reading <a href="http://www.modernperlbooks.com/mt/2009/07/fearpm.html">chromatic&#8217;s latest</a>, wherein he links to a <a href="http://groups.google.com/group/perl.perl5.porters/msg/e234c986c6d04661">p5p post</a> which mentions the whole bit about <code>@INC</code> including multiple point releases in it, which makes having them around expensive.  In case you didn&#8217;t know it, you can install perl point releases in the same directory and the default <code>@INC</code> will include all the releases in descending order, meaning that you can use binary modules from prior point releases without recompiling them.</p>
<p>But why?</p>
<p>If you&#8217;re going to go to the trouble of compiling a new perl executable, how much more effort is it to recompile everything else in your install?  If you&#8217;re using continuous integration, don&#8217;t merely use it on your code, use it on the CPAN modules you use as well.</p>
<p>The whole idea of mixing point releases seems like it&#8217;s a nightmare waiting to happen.</p>
<p>Actually, why are you upgrading an existing perl installation at all?  What if there&#8217;s some code that can&#8217;t deal even with a point release upgrade?  You shouldn&#8217;t force that upgrade on others in your organization.  Put the point release into a different directory and lock it down.  Don&#8217;t use <code>site_perl</code>; install all of your modules into some private area and use <code>PERL5LIB</code>.  (Learn to use <code>INSTALL_BASE</code> with <code>ExtUtils::MakeMaker</code> and <code>install_base</code> with <code>Module::Build</code>.)</p>
<br /> Tagged: maintenance, upgrading <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/134/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/134/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/134/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=134&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/07/01/one-thing-ive-never-understood-about-the-perl-core-binary-compatibility/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Dear LazyCPAN, please create these documentation modules.</title>
		<link>http://elliotlovesperl.com/2009/06/28/dear-lazycpan-please-create-these-documentation-modules/</link>
		<comments>http://elliotlovesperl.com/2009/06/28/dear-lazycpan-please-create-these-documentation-modules/#comments</comments>
		<pubDate>Mon, 29 Jun 2009 03:40:47 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[Pod::Coverage]]></category>
		<category><![CDATA[PPI]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=132</guid>
		<description><![CDATA[Ideas that I&#8217;ve got floating around, but which I haven&#8217;t gotten to yet: Pod::Coverage::PPI Like Pod::Coverage, but rather than looking at the symbol table, uses PPI to discover subs that need documenting. Pod::Coverage::Moose Like Pod::Coverage, but, in addition to regular subroutines requiring documentation, reports on Moose generated accessors, delegations, etc. that are undocumented. Pod::Coverage::PPIMoose Combines [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=132&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ideas that I&#8217;ve got floating around, but which I haven&#8217;t gotten to yet:</p>
<dl>
<dt>Pod::Coverage::PPI</dt>
<dd>Like <a href="http://search.cpan.org/perldoc/Pod::Coverage">Pod::Coverage</a>, but rather than looking at the symbol table, uses <a href="http://search.cpan.org/perldoc/PPI">PPI</a> to discover <code>sub</code>s that need documenting.</dd>
<dt>Pod::Coverage::Moose</dt>
<dd>Like <a href="http://search.cpan.org/perldoc/Pod::Coverage">Pod::Coverage</a>, but, in addition to regular subroutines requiring documentation, reports on <a href="http://search.cpan.org/perldoc/Moose">Moose</a> generated accessors, delegations, etc. that are undocumented.</dd>
<dt>Pod::Coverage::PPIMoose</dt>
<dd>Combines the two others.</dd>
</dl>
<br /> Tagged: documentation, modules, Moose, Pod::Coverage, PPI <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/132/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/132/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/132/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=132&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/28/dear-lazycpan-please-create-these-documentation-modules/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Perl::Critic supports autodie.</title>
		<link>http://elliotlovesperl.com/2009/06/23/perlcritic-supports-autodie/</link>
		<comments>http://elliotlovesperl.com/2009/06/23/perlcritic-supports-autodie/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 14:08:05 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[autodie]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[yapc]]></category>
		<category><![CDATA[yapcna2009]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=128</guid>
		<description><![CDATA[In chromatic&#8217;s session this morning, there was a comment that Perl::Critic didn&#8217;t support autodie. It actually has supported it since New Year&#8217;s day of this year. Let me say emphatically that one of the core Perl::Critic developers (i.e. me) loves autodie. If he could, he would marry it. If you aren&#8217;t using autodie, please do [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=128&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>In chromatic&#8217;s session this morning, there was a comment that Perl::Critic didn&#8217;t support <a href="http://search.cpan.org/dist/autodie">autodie</a>. It actually has supported it since New Year&#8217;s day of this year.</p>
<p>Let me say emphatically that one of the core Perl::Critic developers (i.e. me) loves autodie. If he could, he would marry it.</p>
<p>If you aren&#8217;t using autodie, please do so.</p>
<p>Please use autodie.  PLEASE use autodie.  PLEASE &#8220;use autodie;&#8221;!!!</p>
<p>(Or, even better &#8220;use autodie qw&lt; :all &gt;;&#8221;.)</p>
<br /> Tagged: autodie, modules, Perl::Critic, yapc, yapcna2009 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/128/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/128/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/128/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=128&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/23/perlcritic-supports-autodie/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>A reasonable approach for Modern::Perl.</title>
		<link>http://elliotlovesperl.com/2009/06/23/a-reasonable-approach-for-modernperl/</link>
		<comments>http://elliotlovesperl.com/2009/06/23/a-reasonable-approach-for-modernperl/#comments</comments>
		<pubDate>Tue, 23 Jun 2009 13:36:16 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[modern perl]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[yapc]]></category>
		<category><![CDATA[yapcna2009]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=122</guid>
		<description><![CDATA[At YAPC::NA this morning, chromatic answered my question about Modern::Perl, &#8220;What happens when perl 5.12 comes out?&#8221;, with what I think is a good solution. The proposed answer is for Modern::Perl to take a date parameter to indicate what &#8220;modern&#8221; means. This is brilliant because it explains to even the unknowledgeable programmer when the code [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=122&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>At YAPC::NA this morning, chromatic answered <a href="http://elliotlovesperl.com/2009/05/17/the-problem-with-modernperl/">my question about Modern::Perl</a>, &#8220;What happens when perl 5.12 comes out?&#8221;, with what I think is a good solution.</p>
<p>The proposed answer is for Modern::Perl to take a date parameter to indicate what &#8220;modern&#8221; means.  This is brilliant because it explains to even the unknowledgeable programmer when the code was current.  Say the syntax is like:</p>
<pre>
    use Modern::Perl as_of =&gt; '2009-06-23';
</pre>
<p>What could be more clear?</p>
<br /> Tagged: modern perl, modules, yapc, yapcna2009 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/122/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/122/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/122/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=122&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/23/a-reasonable-approach-for-modernperl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>What I got out of the Parrot Workshop.</title>
		<link>http://elliotlovesperl.com/2009/06/22/what-i-got-out-of-the-parrot-workshop/</link>
		<comments>http://elliotlovesperl.com/2009/06/22/what-i-got-out-of-the-parrot-workshop/#comments</comments>
		<pubDate>Mon, 22 Jun 2009 17:06:42 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[parrot]]></category>
		<category><![CDATA[perl 6]]></category>
		<category><![CDATA[rakudo]]></category>
		<category><![CDATA[yapc]]></category>
		<category><![CDATA[yapcna2009]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=114</guid>
		<description><![CDATA[I previously wrote about what I wanted out of the Parrot workshop. So, here&#8217;s what I actually got. There are some amazingly smart people working on Parrot/Rakudo who really believe in the promise of both. I need to actually start learning Perl 6. My wrote my first baby Perl 6 programs Saturday. It&#8217;s nice to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=114&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I previously wrote about <a href="http://elliotlovesperl.com/2009/06/13/what-i-want-out-of-the-parrot-workshop/">what I wanted out of the Parrot workshop</a>.  So, here&#8217;s what I actually got.</p>
<ul>
<li>There are some amazingly smart people working on Parrot/Rakudo who really believe in the promise of both.</li>
<li>I need to actually start learning Perl 6.  My wrote my first baby Perl 6 programs Saturday.  It&#8217;s nice to have something that&#8217;s like (for some definition of &#8220;like&#8221;) Perl 5, but organized from the start so that things are consistent.  Right now, all I see are the problems from Perl 5 that have been fixed; I don&#8217;t see any of the problems that exist in Perl 6 yet.</p>
<li>A lot of the introspection functionality isn&#8217;t there yet.  Since things are still in flux, there isn&#8217;t a lot of concrete documentation on what each class does.  Thus, I figured the easiest way to learn what&#8217;s there, as opposed to what&#8217;s in the spec, was to first figure out the introspection mechanisms and use those to poke around.  It turns out that the <code>$foo.HOW().^attributes()</code> method doesn&#8217;t exist yet, so looking for the structure of classes isn&#8217;t possible yet.  However, the <code>$foo.HOW().^methods()</code> method does exist, so I started exploring that.  My first try at simply listing the methods on an object (<code>say $_ for 1.^methods()</code>) resulted in some expected stuff, but there were a bunch of &#8220;1&#8243;s and &#8220;2&#8243;s in there.  It turns out that those are collections of multi methods (which are like overloaded methods in other languages, but the determination of which variant to use is made at runtime, not compile time).  This is when I learned that a bunch of Rakudo classes (e.g. the multi method classes) are actually Parrot classes (currently) and thus they don&#8217;t act like Perl 6 classes are supposed to, so it&#8217;s hard to introspect those.</li>
<li>With the goal of starting on Perl6::Critic, I learned that I can get a parse tree via <code>my $parse_tree = Perl6::Grammar.parse($source_code);</code> or <code>my $parse_tree = Perl6::Compiler.compile($parse_tree, :target('parse'));</code>, or even get the abstract syntax tree via <code>my $ast = Perl6::Compiler.compile($parse_tree, :target('past'));</code>.</li>
<li>I had heard that Perl 6 supported classes and prototypes, but I had no idea where the prototypes came in.  It turns out that Perl 6 classes are actually implemented as prototypes.  In fact, classes are &#8220;instances&#8221; of themselves, specifically the <code>undef</code> instance.  So, when you declare a typed variable, but don&#8217;t provide an initial value, the <code>undef</code> that the variable gets initialized to is the class itself.  Given
<pre>
    my SomeClass $x;
    my $y = SomeClass;
</pre>
<p><code>$x</code> and <code>$y</code> refer to the identical thing.  This is seriously cool stuff.</li>
<li>Parrot is far enough along that people are actually discussing cross-language issues such as IPC and standard Parrot libraries.</li>
<li>Some people aren&#8217;t happy writing code in &#8220;assembly language&#8221; (PIR) and are thus creating &#8220;C&#8221; for Parrot (Close, as in &#8220;close to C&#8221;).</li>
<li>Rakudo cannot handle the official Perl 6 grammar, STD.pm, yet, so I need to work with the Rakudo grammar.</li>
<li>I can actually see an approach to tackling Perl::Critic for Perl 6.  The first thing I want to do is create a <a href="http://perlcritic.tigris.org/source/browse/perlcritic/trunk/distributions/Perl-Critic/tools/ppidump?view=markup">ppidump</a> for Perl 6.  Parrot has a means of doing this, but I want something in regular Perl 6, not only for the functionality, but to learn how to walk the parse tree.  The next step is to implement a <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/ValuesAndExpressions/ProhibitMagicNumbers.pm">ProhibitMagicNumbers</a> program; no configuration, no options, just take a set of file names and spit some stuff out.  Patrick suggested that I could subclass the grammar and use actions on it to find the numbers and look at the surroundings; that would work for a specific policy, but this initial program would be an exploration in how to do the real Perl::Critic and I don&#8217;t plan on a grammar subclass per policy.  (That would mean that each file would need to be parsed individually for each policy.)</li>
</ul>
<br /> Tagged: parrot, perl 6, rakudo, yapc, yapcna2009 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/114/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/114/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/114/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=114&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/22/what-i-got-out-of-the-parrot-workshop/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Moose as documentation.</title>
		<link>http://elliotlovesperl.com/2009/06/16/moose-as-documentation/</link>
		<comments>http://elliotlovesperl.com/2009/06/16/moose-as-documentation/#comments</comments>
		<pubDate>Wed, 17 Jun 2009 02:43:14 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[documentation]]></category>
		<category><![CDATA[Moose]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=112</guid>
		<description><![CDATA[Forgetting all the type constraint, role, and attribute handling that Moose does, I like it simply for what it&#8217;s contributed to documentation. I&#8217;ve been using the constraint syntax for describing complicated data structures in POD and comments in cases where Moose isn&#8217;t actually involved. It&#8217;s nice to be able to simply state that a subroutine [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=112&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Forgetting all the type constraint, role, and attribute handling that Moose does, I like it simply for what it&#8217;s contributed to documentation.</p>
<p>I&#8217;ve been using the constraint syntax for describing complicated data structures in POD and comments in cases where Moose isn&#8217;t actually involved.  It&#8217;s nice to be able to simply state that a subroutine returns &#8220;ArrayRef[HashRef[Maybe[Str|HashRef[Foo::Bar]]]&#8221;.  That&#8217;s a lot more comprehensible than a paragraph of description.</p>
<br /> Tagged: documentation, Moose <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/112/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/112/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/112/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=112&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/16/moose-as-documentation/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>What I want out of the Parrot Workshop.</title>
		<link>http://elliotlovesperl.com/2009/06/13/what-i-want-out-of-the-parrot-workshop/</link>
		<comments>http://elliotlovesperl.com/2009/06/13/what-i-want-out-of-the-parrot-workshop/#comments</comments>
		<pubDate>Sat, 13 Jun 2009 17:16:33 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[parrot]]></category>
		<category><![CDATA[perl 6]]></category>
		<category><![CDATA[yapc]]></category>
		<category><![CDATA[yapcna2009]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=108</guid>
		<description><![CDATA[I&#8217;m going to the Parrot virtual machine workshop next weekend. The suggestion has been made that &#8220;anyone who is coming from out of town to attend the Parrot talks is already involved with Parrot&#8221; and the schedule is too introductory. I beg to differ. I am not presently involved with Parrot, nor do I expect [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=108&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m going to the <a href="http://yapc10.org/yn2009/wiki?node=Parrot%20Virtual%20Machine%20Workshop%202009">Parrot virtual machine workshop</a> next weekend.  The suggestion has been made that &#8220;<a href="http://groups.google.com/group/parrot-virtual-machine-workshop-2009/msg/8ac4bee1f53c4339">anyone who is coming from out of town to attend the Parrot talks is already involved with Parrot</a>&#8221; and the schedule is too introductory.  I beg to differ.</p>
<p>I am not presently involved with Parrot, nor do I expect to be in the future; I&#8217;m already behind on the projects that I&#8217;m involved with or want/need to start.  At most, I expect that I&#8217;ll be filing bug reports.</p>
<p>I&#8217;m expecting that I&#8217;ll be using things running on Parrot.  I want to understand what&#8217;s going on underneath in order to make my life in understanding higher level things easier.  As a point of comparison, there are some edge cases in Java&#8217;s behavior that you cannot understand without knowing how the Java virtual machine works.</p>
<p>I want to know how to drop to a lower level, if the higher level code running on the VM isn&#8217;t working out for some reason.</p>
<p>When dealing with Perl 6 specifically, I want to know what I can get at the Parrot bytecode level and what I need to do with STD.pm.  I&#8217;m probably going to be involved in a Perl 6 version of <a href="http://perlcritic.com/">Perl Critic</a> and I&#8217;d like to know what would be possible in terms of a generic higher-level-language-running-on-Parrot critic.  (Yes, I don&#8217;t know how to use a programming language that&#8217;s still not finished being designed and I&#8217;m already planning on to tell you that you&#8217;re using it wrong.)</p>
<br /> Tagged: parrot, perl 6, yapc, yapcna2009 <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/108/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/108/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/108/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=108&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/13/what-i-want-out-of-the-parrot-workshop/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Using NYTProf to understand why not to do something.</title>
		<link>http://elliotlovesperl.com/2009/06/06/using-nytprof-to-understand-why-not-to-do-something/</link>
		<comments>http://elliotlovesperl.com/2009/06/06/using-nytprof-to-understand-why-not-to-do-something/#comments</comments>
		<pubDate>Sat, 06 Jun 2009 17:32:19 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Benchmark]]></category>
		<category><![CDATA[DateTime]]></category>
		<category><![CDATA[Devel::NYTProf]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[profiling]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=102</guid>
		<description><![CDATA[Mr. Bunce is asking for examples of how NYTProf told you what to fix with poorly performing code. Instead, I&#8217;m going to give an example of how NYTProf told me why I shouldn&#8217;t fix something a particular way. I&#8217;ve got an app that needs to analyze a bunch of logs. Having used NYTProf in the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=102&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mr. Bunce is <a href="http://blog.timbunce.org/2009/06/05/has-nytprof-helped-you-tell-me-how/">asking for examples</a> of how <a href="http://search.cpan.org/dist/Devel-NYTProf/">NYTProf</a> told you what to fix with poorly performing code.</p>
<p>Instead, I&#8217;m going to give an example of how NYTProf told me why I shouldn&#8217;t fix something a particular way.</p>
<p>I&#8217;ve got an app that needs to analyze a bunch of logs.  Having used NYTProf in the past to identify that creation of <a href="http://search.cpan.org/dist/DateTime/">DateTime</a> objects is my biggest issue, I was thinking of ways to improve the situation.  One thing I thought of is being able to create a DateTime based upon an epoch time instead of individual date components (year, month, etc.), with the idea that the cost of deriving the epoch time from the date components was what was expensive (I can affect the format of some of the logs, and thus could get the epoch time emitted).  So, I quickly threw together a little <a href="http://search.cpan.org/perldoc?Benchmark">Benchmark</a> program that compared the costs of constructing DateTimes from each type of data.  I was shocked to discover that creating objects based upon epoch times was over 20% more expensive than creating them out of date components.</p>
<p>What was going on?  NYTProf provided me with the answer.  I created two simple programs that created 100,000 DateTime objects, one for each kind of constructor arguments.  I profiled both of them and compared the NYTProf output for them.  This led me to looking at the <code>from_epoch()</code> code in the NYTProf generated HTML, and finding that DateTime passes the epoch time to <code>gmtime</code> to get the date components and then calls the regular constructor with those.  The extra cost isn&#8217;t really in the <code>gmtime</code> calls, but a good part of it is in the use of <a href="http://search.cpan.org/dist/Params-Validate/">Params::Validate</a> in all of the public methods to check arguments and the epoch time path takes the code path through an additional public method.</p>
<p>Benchmark told me that I shouldn&#8217;t make a change and NYTProf allowed me to understand why that that result was correct and there wasn&#8217;t something wrong with my Benchmark use.</p>
<br /> Tagged: Benchmark, DateTime, Devel::NYTProf, modules, performance, profiling <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/102/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/102/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/102/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=102&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/06/06/using-nytprof-to-understand-why-not-to-do-something/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Dealing with perl binary compatibility issues as a user of XS modules.</title>
		<link>http://elliotlovesperl.com/2009/05/25/dealing-with-perl-binary-compatibility-issues-as-a-user-of-xs-modules/</link>
		<comments>http://elliotlovesperl.com/2009/05/25/dealing-with-perl-binary-compatibility-issues-as-a-user-of-xs-modules/#comments</comments>
		<pubDate>Mon, 25 May 2009 22:46:37 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[continuous integration]]></category>
		<category><![CDATA[modern perl]]></category>
		<category><![CDATA[upgrading]]></category>
		<category><![CDATA[xs]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=100</guid>
		<description><![CDATA[chromatic discusses binary compatibility with the perl executable. I&#8217;m someone who only uses XS modules and hopes to never have to write one. Yet, unlike what seems to be the prevailing fear, I don&#8217;t worry about binary compatibility. I don&#8217;t worry about upgrades breaking things. I don&#8217;t worry that I&#8217;m going to have mismatches in [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=100&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>chromatic <a href="http://www.modernperlbooks.com/mt/2009/05/perl-5-and-binary-compatibility.html">discusses binary compatibility with the perl executable</a>.  I&#8217;m someone who only uses XS modules and hopes to never have to write one.  Yet, unlike what seems to be the prevailing fear, I don&#8217;t worry about binary compatibility.  I don&#8217;t worry about upgrades breaking things.  I don&#8217;t worry that I&#8217;m going to have mismatches in executables/libraries.</p>
<p>Why?  <a href="http://en.wikipedia.org/wiki/Continuous_integration">Continuous integration</a>.</p>
<p>Don&#8217;t just grab modules from the CPAN and install them somewhere never to be upgraded until you&#8217;re forced to at a huge amount of time and expense.  Regularly rebuild everything you use, preferably daily or hourly.</p>
<ol>
<li>Install a perl binary and then lock it down.  Don&#8217;t use site dirs.  Have the perl core be inviolate.</li>
<li>Instead, install to some other directory and point <code>PERL5LIB</code> at it.  Both CPAN and CPANPLUS allow you to configure what you want to be passed to the configuration program.  Pass a value for <code>INSTALL_BASE</code> to <code>Makefile.PL</code> and <code>install_base</code> to <code>Build.PL</code> that points to your directory.</li>
<li>Set up a build server to use CPAN or CPANPLUS to &#8220;install&#8221; and build everything.  Since your build machine will be rebuilding everything regularly, when you upgrade your perl binary or an XS module, any problems will be quickly identified.  Everything being rebuilt in one go means that all binary code will match up and you don&#8217;t have to worry about them getting out of sync.  Because installing a distribution causes all of that distribution&#8217;s tests to be run, you&#8217;ll know that that distribution works in <em>your environment</em>.</li>
</ol>
<p>(If you&#8217;re using taint mode and thus cannot use <code>PERL5LIB</code>, have your build machine build a custom perl executable along with everything else.)</p>
<p>Details for doing this belong in another post.  But the point is, if you regularly rebuild all of the CPAN code you use, you don&#8217;t need to worry about binary issues.</p>
<br /> Tagged: administration, continuous integration, modern perl, upgrading, xs <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/100/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/100/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/100/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=100&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/05/25/dealing-with-perl-binary-compatibility-issues-as-a-user-of-xs-modules/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>DarkPAN setup</title>
		<link>http://elliotlovesperl.com/2009/05/25/darkpan-setup/</link>
		<comments>http://elliotlovesperl.com/2009/05/25/darkpan-setup/#comments</comments>
		<pubDate>Mon, 25 May 2009 06:44:01 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[darkpan]]></category>
		<category><![CDATA[MyCPAN::App::DPAN]]></category>
		<category><![CDATA[MyCPAN::Indexer]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=98</guid>
		<description><![CDATA[Gabor is looking at setting up corporate CPANs. While it doesn&#8217;t cover the web interfaces that he wants, brian d foy has been working on MyCPAN::Indexer and MyCPAN::App::DPAN. The former has been in progress for a while as part of brian&#8217;s BackPAN indexing work. The latter is a more recent effort at creating a tool [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=98&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Gabor is looking at <a href="http://szabgab.com/blog/2009/05/1243228620.html">setting up corporate CPANs</a>.  While it doesn&#8217;t cover the web interfaces that he wants, brian d foy has been working on <a href="http://search.cpan.org/dist/MyCPAN-Indexer/">MyCPAN::Indexer</a> and <a href="http://search.cpan.org/dist/MyCPAN-App-DPAN/">MyCPAN::App::DPAN</a>.</p>
<p>The former has been in progress for a while as part of brian&#8217;s BackPAN indexing work.  The latter is a more recent effort at creating a tool for managing CPAN-like repositories.  It can copy archives into a repository and update the standard index files.  It&#8217;s being used on a daily basis on both Windows and Linux to maintain a single DarkPAN at present, and, once some more work on automated building of Perl distributions under TeamCity is done, will be used for maintaining a lot more private repositories.</p>
<p>The way that a repository is updated is to have a copy of it checked out of Subversion, put the distribution archive in place, run dpan on it to update the indexes, and check in the result. CPAN.pm can be pointed at the Subversion HTTP URL and use it just as if it were one of the public CPAN mirrors.  (Though of course, the DarkPAN repository has a restricted set of distributions in it, not even a mini-CPAN.)</p>
<br /> Tagged: darkpan, MyCPAN::App::DPAN, MyCPAN::Indexer <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=98&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/05/25/darkpan-setup/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>The problem with Modern::Perl.</title>
		<link>http://elliotlovesperl.com/2009/05/17/the-problem-with-modernperl/</link>
		<comments>http://elliotlovesperl.com/2009/05/17/the-problem-with-modernperl/#comments</comments>
		<pubDate>Sun, 17 May 2009 18:46:38 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[modern perl]]></category>
		<category><![CDATA[modules]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=43</guid>
		<description><![CDATA[Modern::Perl has laudable goals. I agree with chromatic. This is why I use 5.10.0 at work. This is why I will be upgrading to 5.10.1 almost as soon as it is released. I even plan on testing our code with the 5.10.1 release candidates. The first significant line in all our modules is &#8220;use 5.010;&#8220;. [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=43&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://search.cpan.org/dist/Modern-Perl/lib/Modern/Perl.pm">Modern::Perl</a> has <a href="http://www.modernperlbooks.com/mt/2009/01/why-modern-perl.html">laudable</a> <a href="http://www.modernperlbooks.com/mt/2009/01/toward-a-modernperl.html">goals</a>.  I agree with chromatic.  This is why I use 5.10.0 at work.  This is why I will be upgrading to 5.10.1 almost as soon as it is released.  I even plan on testing our code with the 5.10.1 release candidates.  The first significant line in all our modules is &#8220;<code>use 5.010;</code>&#8220;.  (The second is &#8220;<code>use utf8;</code>&#8220;.)  As I said in a prior post, I upgrade all the modules that we use from the CPAN every three months.</p>
<p>However, as a practical matter, Modern::Perl is broken.  What happens when perl 5.12 comes out?  Does chromatic upgrade the module to add &#8220;<code>use feature qw/ :5.12 /;</code>&#8220;?  Are all of the modules that use Modern::Perl suddenly broken?  Someone requested that <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/TestingAndDebugging/RequireUseStrict.pm">TestingAndDebugging::RequireUseStrict</a> include Modern::Perl in the default set of modules that are treated as equivalent to &#8220;<code>use strict;</code>&#8220;.  (You can add to that list yourself via the &#8220;<code>equivalent_modules</code>&#8221; option.)  I don&#8217;t want to do that; I want to discourage the use of Modern::Perl.  Maybe if there was a Modern::Perl_5_10 I&#8217;d think differently.</p>
<br /> Tagged: modern perl, modules <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/43/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/43/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/43/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=43&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/05/17/the-problem-with-modernperl/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>pmtools</title>
		<link>http://elliotlovesperl.com/2009/05/16/pmtools/</link>
		<comments>http://elliotlovesperl.com/2009/05/16/pmtools/#comments</comments>
		<pubDate>Sun, 17 May 2009 02:34:32 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[things I like]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=31</guid>
		<description><![CDATA[pmtools is a set of little utilities for dealing with your installed modules. (Unfortunately, if you want to install these using CPAN.pm or CPANPLUS, you need to tell them to install &#8220;Devel::Loaded&#8221;.) The ones that I use on a daily basis are pmpath, pmvers, and pminst. I use pminst and pmvers to maintain a couple [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=31&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://search.cpan.org/dist/pmtools/">pmtools</a> is a set of little utilities for dealing with your installed modules.  (Unfortunately, if you want to install these using CPAN.pm or CPANPLUS, you need to tell them to install &#8220;Devel::Loaded&#8221;.)</p>
<p>
The ones that I use on a daily basis are <a href="http://search.cpan.org/dist/pmtools/pmpath">pmpath</a>, <a href="http://search.cpan.org/dist/pmtools/pmvers">pmvers</a>, and <a href="http://search.cpan.org/dist/pmtools/pminst">pminst</a>.</p>
<p>
I use pminst and pmvers to <a href="http://search.cpan.org/perldoc?dpan">maintain</a> a couple of DarkPANs, a.k.a. <a href="http://www252.pair.com/comdog/Talks/MyCPAN-FrozenPerl-lightning.pdf">internal CPANs</a>.  I want to manage the versions of modules we use so that we don&#8217;t get surprises, like they won&#8217;t compile in our environment or they make changes that we can&#8217;t deal with right away.  So, we have repositories in the standard CPAN layout and point CPAN(PLUS)? to those instead of the public CPAN.</p>
<p>
Since the install tools are pointed at an internal repository, when I want to use a module that we haven&#8217;t used before, I need to download the distribution myself.  It&#8217;s not as simple as just grabbing the distribution archive.  I need to get the module&#8217;s dependencencies.  In order to find out which of those I&#8217;ve already gets installed, I use pminst.</p>
<p>
If I run into a problem with a module, I need to figure out which version I&#8217;ve got in order to look at whether there&#8217;s an updated version or to properly report a bug.  Thus, pmvers.</p>
<p>
I regularly need to figure out what path I&#8217;m getting a module from, for example whether it&#8217;s in the core perl install or in my installed modules path.  (In order to avoid cross-project module version entanglements, we don&#8217;t use sitelibs; we use separate install directories.  The core perl installation is readonly and nothing ever gets added to it.)  pmpath probably gets the most usage of the three.</p>
<p>
The most common of my use of pmpath isn&#8217;t actually direct.  When I get an exception in some module, I want to bring it up in the editor to see the code.  I&#8217;ve created a script that I call pmedit:</p>
<div style="background-color:#333;margin:1em 2em;">
<font face="monospace"><font color="#fbf204">&nbsp;1 </font><font color="#86cdeb">#!/usr/bin/env bash</font><br />
<font color="#fbf204">&nbsp;2 </font><br />
<font color="#fbf204">&nbsp;3 </font><font color="#f0e68b"><b>if </b></font><font color="#ffdeac">[[</font>&nbsp;<font color="#cc5c5c">$#</font>&nbsp;<font color="#f0e68b"><b>-le</b></font>&nbsp;<font color="#ffa0a0">0</font>&nbsp;<font color="#ffdeac">]]</font><br />
<font color="#fbf204">&nbsp;4 </font><font color="#f0e68b"><b>then</b></font><br />
<font color="#fbf204">&nbsp;5 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>echo</b></font><font color="#ffa0a0">&nbsp;</font><font color="#f0e68b"><b>&quot;</b></font><font color="#ffa0a0">usage: </font><font color="#cc5c5c">$0</font><font color="#ffa0a0">&nbsp;module [...]</font><font color="#f0e68b"><b>&quot;</b></font><font color="#ffa0a0">&nbsp;</font><font color="#f0e68b"><b>&gt;</b></font><font color="#f0e68b"><b>&amp;</b></font><font color="#ffa0a0">2</font><br />
<font color="#fbf204">&nbsp;6 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>exit</b></font>&nbsp;<font color="#ffa0a0">1</font><br />
<font color="#fbf204">&nbsp;7 </font><font color="#f0e68b"><b>fi</b></font><br />
<font color="#fbf204">&nbsp;8 </font><br />
<font color="#fbf204">&nbsp;9 </font><font color="#f0e68b"><b>declare</b></font><font color="#98fa98">&nbsp;</font><font color="#ffdeac">-a</font><font color="#98fa98">&nbsp;FILES</font><br />
<font color="#fbf204">10 </font><br />
<font color="#fbf204">11 </font><font color="#f0e68b"><b>for </b></font>MODULE <font color="#f0e68b"><b>in</b></font>&nbsp;<font color="#f0e68b"><b>&quot;</b></font><font color="#cc5c5c">$@</font><font color="#f0e68b"><b>&quot;</b></font><br />
<font color="#fbf204">12 </font><font color="#f0e68b"><b>do</b></font><br />
<font color="#fbf204">13 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#98fa98">FILE</font>=<font color="#ffdeac">`pmpath </font><font color="#f0e68b"><b>&quot;</b></font><font color="#cc5c5c">${</font><font color="#cc5c5c">MODULE</font><font color="#cc5c5c">}</font><font color="#f0e68b"><b>&quot;</b></font><font color="#ffdeac">&nbsp;</font><font color="#ffa0a0">2</font><font color="#ffdeac">&gt;/dev/null`</font><br />
<font color="#fbf204">14 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>if </b></font><font color="#ffdeac">[[</font>&nbsp;<font color="#f0e68b"><b>-z</b></font>&nbsp;<font color="#f0e68b"><b>&quot;</b></font><font color="#cc5c5c">${</font><font color="#cc5c5c">FILE</font><font color="#cc5c5c">}</font><font color="#f0e68b"><b>&quot;</b></font>&nbsp;<font color="#ffdeac">]]</font><br />
<font color="#fbf204">15 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>then</b></font><br />
<font color="#fbf204">16 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>echo</b></font><font color="#ffa0a0">&nbsp;</font><font color="#f0e68b"><b>&quot;</b></font><font color="#ffa0a0">Could not find </font><font color="#cc5c5c">${</font><font color="#cc5c5c">MODULE</font><font color="#cc5c5c">}</font><font color="#ffa0a0">.</font><font color="#f0e68b"><b>&quot;</b></font><font color="#ffa0a0">&nbsp;</font><font color="#f0e68b"><b>&gt;</b></font><font color="#f0e68b"><b>&amp;</b></font><font color="#ffa0a0">2</font><br />
<font color="#fbf204">17 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>else</b></font><br />
<font color="#fbf204">18 </font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILES<font color="#f0e68b"><b>[</b></font><font color="#cc5c5c">${#</font><font color="#cc5c5c">FILES</font><font color="#cc5c5c">[</font>@<font color="#cc5c5c">]</font><font color="#cc5c5c">}</font><font color="#f0e68b"><b>]</b></font><font color="#f0e68b"><b>=</b></font><font color="#ffa0a0">&quot;${FILE}&quot;</font><br />
<font color="#fbf204">19 </font>&nbsp;&nbsp;&nbsp;&nbsp;<font color="#f0e68b"><b>fi</b></font><br />
<font color="#fbf204">20 </font><font color="#f0e68b"><b>done</b></font><br />
<font color="#fbf204">21 </font><br />
<font color="#fbf204">22 </font><font color="#f0e68b"><b>if </b></font><font color="#ffdeac">[[</font>&nbsp;<font color="#cc5c5c">${#</font><font color="#cc5c5c">FILES</font><font color="#cc5c5c">[</font>@<font color="#cc5c5c">]</font><font color="#cc5c5c">}</font>&nbsp;<font color="#f0e68b"><b>-gt</b></font>&nbsp;<font color="#ffa0a0">0</font>&nbsp;<font color="#ffdeac">]]</font><br />
<font color="#fbf204">23 </font><font color="#f0e68b"><b>then</b></font><br />
<font color="#fbf204">24 </font>&nbsp;&nbsp;&nbsp;&nbsp;gvim <font color="#f0e68b"><b>&quot;</b></font><font color="#cc5c5c">${</font><font color="#cc5c5c">FILES</font><font color="#cc5c5c">[</font>@<font color="#cc5c5c">]</font><font color="#cc5c5c">}</font><font color="#f0e68b"><b>&quot;</b></font><br />
<font color="#fbf204">25 </font><font color="#f0e68b"><b>fi</b></font><br />
</font>
</div>
<br /> Tagged: things I like, tools <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/31/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/31/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/31/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=31&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/05/16/pmtools/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Eliminating all inheritance from my code.</title>
		<link>http://elliotlovesperl.com/2009/04/24/eliminating-all-inheritance-from-my-code/</link>
		<comments>http://elliotlovesperl.com/2009/04/24/eliminating-all-inheritance-from-my-code/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 18:22:29 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[Moose]]></category>
		<category><![CDATA[roles]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=95</guid>
		<description><![CDATA[Moose Roles rock! I&#8217;m following Ovid&#8216;s example and getting rid of inheritance in my code: nothing will inherit from anything. You&#8217;ll be able to tell what the code does without searching for a superclass&#8217; superclass&#8217; superclass. Tagged: development, Moose, roles<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=95&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.iinteractive.com/moose/">Moose</a> <a href="http://search.cpan.org/dist/Moose/lib/Moose/Manual/Roles.pod">Roles</a> rock! I&#8217;m following <a href="http://use.perl.org/~Ovid/journal/">Ovid</a>&#8216;s example and getting rid of inheritance in my code: nothing will inherit from anything. You&#8217;ll be able to tell what the code does without searching for a superclass&#8217; superclass&#8217; superclass.</p>
<br /> Tagged: development, Moose, roles <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/95/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/95/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/95/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=95&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/04/24/eliminating-all-inheritance-from-my-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>It really feels weird downloading your own code from a public website.</title>
		<link>http://elliotlovesperl.com/2009/03/03/it-really-feels-weird-downloading-your-own-code-from-a-public-website/</link>
		<comments>http://elliotlovesperl.com/2009/03/03/it-really-feels-weird-downloading-your-own-code-from-a-public-website/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 18:19:47 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[using Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=92</guid>
		<description><![CDATA[Downloading the Perl::Critic from work which I uploaded at home this morning. It&#8217;s a different feeling than downloading from private &#8216;net storage; it&#8217;s just a transfer mechanism in that case. But using the CPAN to get your own open-source code is just&#8230; interesting feeling. Tagged: open source, using Perl::Critic<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=92&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Downloading the Perl::Critic from work which I uploaded at home this morning. It&#8217;s a different feeling than downloading from private &#8216;net storage; it&#8217;s just a transfer mechanism in that case. But using the CPAN to get your own open-source code is just&#8230; interesting feeling.</p>
<br /> Tagged: open source, using Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/92/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/92/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/92/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=92&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/03/03/it-really-feels-weird-downloading-your-own-code-from-a-public-website/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Someone&#8217;s built a GUI on top of my code!</title>
		<link>http://elliotlovesperl.com/2009/02/26/someones-built-a-gui-on-top-of-my-code/</link>
		<comments>http://elliotlovesperl.com/2009/02/26/someones-built-a-gui-on-top-of-my-code/#comments</comments>
		<pubDate>Thu, 26 Feb 2009 18:15:26 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[using Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=89</guid>
		<description><![CDATA[I added the metadata functionality to Perl::Critic that allows this sort of thing a while back and now some one is finally using it. Woohoo! I&#8217;m quite chuffed. Tagged: using Perl::Critic<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=89&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I added the metadata functionality to Perl::Critic that allows this sort of thing a while back and now some one is finally using it. Woohoo!</p>
<p><a href="http://docs.activestate.com/pdk/8.0/PerlCritic_gui.html"><img src="http://elliotlovesperl.files.wordpress.com/2009/05/critic-gui.png?w=510" /></a></p>
<p>I&#8217;m quite chuffed.</p>
<br /> Tagged: using Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/89/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/89/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/89/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=89&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/02/26/someones-built-a-gui-on-top-of-my-code/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>

		<media:content url="http://elliotlovesperl.files.wordpress.com/2009/05/critic-gui.png" medium="image" />
	</item>
		<item>
		<title>Modern Perl</title>
		<link>http://elliotlovesperl.com/2009/02/11/modern-perl/</link>
		<comments>http://elliotlovesperl.com/2009/02/11/modern-perl/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 18:09:37 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[modern perl]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=85</guid>
		<description><![CDATA[Tagged: modern perl<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=85&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://modernperlbooks.com/"><img src="http://elliotlovesperl.files.wordpress.com/2009/05/uncle-sam-uses-modern-perl.jpg?w=510" /></a></p>
<br /> Tagged: modern perl <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/85/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/85/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/85/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=85&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/02/11/modern-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>

		<media:content url="http://elliotlovesperl.files.wordpress.com/2009/05/uncle-sam-uses-modern-perl.jpg" medium="image" />
	</item>
		<item>
		<title>Communicating opinions via method implementation choices in class hierarchies.</title>
		<link>http://elliotlovesperl.com/2009/02/11/communicating-opinions-via-method-implementation-choices-in-class-hierarchies/</link>
		<comments>http://elliotlovesperl.com/2009/02/11/communicating-opinions-via-method-implementation-choices-in-class-hierarchies/#comments</comments>
		<pubDate>Wed, 11 Feb 2009 17:59:18 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=79</guid>
		<description><![CDATA[Dealing with the differences in the ways that the CME and the ICE use FIX has been interesting. Some of the differences are simply, oh, this one does things this way and this other one does things another. And some of them are, this is what I expect should be normal and why the hell [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=79&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Dealing with the differences in the ways that the <a href="http://www.cmegroup.com/">CME</a> and the <a href="https://www.theice.com/">ICE</a> use <a href="http://www.fixprotocol.org/">FIX</a> has been interesting. Some of the differences are simply, oh, this one does things this way and this other one does things another. And some of them are, this is what I expect should be normal and why the hell is this exchange doing things like this? This ends up being reflected in the code.</p>
<p>I&#8217;ve got a base message class with a subclass for each exchange. For the former kind of differences, I&#8217;ve got an abstract method on the base class with the appropriate implementations on the subclasses. For the &#8220;WTF?&#8221; things, I&#8217;ve got a default implementation on the base class, and override that on the specific subclass.</p>
<br /> Tagged: development <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/79/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/79/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/79/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=79&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/02/11/communicating-opinions-via-method-implementation-choices-in-class-hierarchies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>What kind of personality does Perl::Critic have?</title>
		<link>http://elliotlovesperl.com/2009/01/28/what-kind-of-personality-does-perlcritic-have/</link>
		<comments>http://elliotlovesperl.com/2009/01/28/what-kind-of-personality-does-perlcritic-have/#comments</comments>
		<pubDate>Wed, 28 Jan 2009 17:51:43 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=76</guid>
		<description><![CDATA[Probably pedantic, but we&#8217;ll see what it says. Tagged: Perl::Critic, twitter<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=76&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Probably pedantic, but we&#8217;ll see <a>what it says</a>.</p>
<br /> Tagged: Perl::Critic, twitter <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=76&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/01/28/what-kind-of-personality-does-perlcritic-have/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>The most significant Perl::Critic release in a long while.</title>
		<link>http://elliotlovesperl.com/2009/01/01/the-most-significant-perlcritic-release-in-a-long-while/</link>
		<comments>http://elliotlovesperl.com/2009/01/01/the-most-significant-perlcritic-release-in-a-long-while/#comments</comments>
		<pubDate>Thu, 01 Jan 2009 22:01:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[using Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=27</guid>
		<description><![CDATA[Perl::Critic 1.094 is on its way to a CPAN mirror near you. There are a number of changes in it, but there&#8217;s one in particular that I want to point out. A new policy called Miscellanea::ProhibitUselessNoCritic. Adam Kennedy wrote a journal entry where he mentioned &#8220;the expense of having to maintain [## no critic] entries [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=27&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://search.cpan.org/dist/Perl-Critic/">Perl::Critic</a> 1.094 is on its way to a CPAN mirror near you. There are a number of changes in it, but there&#8217;s one in particular that I want to point out. A new policy called <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Miscellanea/ProhibitUselessNoCritic.pm">Miscellanea::ProhibitUselessNoCritic</a>.</p>
<p>
Adam Kennedy wrote <a href="http://use.perl.org/article.pl?sid=08/09/24/1957256">a journal entry</a> where he mentioned &#8220;the expense of having to maintain [<code>## no critic</code>] entries permanently&#8221;. This inspired the creation of the new policy.</p>
<p>
One of the problems with Perl::Critic is that you may, over time, end up with policy disabling comments scattered across your code that no longer apply, making the code harder to understand. This policy will complain about any <code>## no critic</code> that doesn&#8217;t actually disable any policies. You then know that you can remove those comments, making your code cleaner and congratulating yourself for solving whatever issue that caused you to put it there in the first place.</p>
<p>
This post originally appeared at <a href="http://use.perl.org/~elliot/journal/38199">use.perl.org</a>.</p>
<br /> Tagged: using Perl::Critic <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/27/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/27/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/27/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=27&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2009/01/01/the-most-significant-perlcritic-release-in-a-long-while/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Improbable vs Statistically Impossible</title>
		<link>http://elliotlovesperl.com/2008/10/10/improbable-vs-statistically-impossible/</link>
		<comments>http://elliotlovesperl.com/2008/10/10/improbable-vs-statistically-impossible/#comments</comments>
		<pubDate>Fri, 10 Oct 2008 17:44:32 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=69</guid>
		<description><![CDATA[Schwern on git hashes. Every time this comes up someone says &#8220;but what if they collide?! Hashes sometimes collide!&#8221; I confess to being one of those who want things to be really impossible, not merely &#8220;statistically impossible&#8221;. Tagged: development<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=69&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://use.perl.org/~schwern/journal/37600">Schwern on git hashes.</a></p>
<blockquote><p>Every time this comes up someone says &#8220;but what if they collide?! Hashes sometimes collide!&#8221;</p></blockquote>
<p>I confess to being one of those who want things to be really impossible, not merely &#8220;statistically impossible&#8221;.</p>
<br /> Tagged: development <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/69/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/69/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/69/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=69&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/10/10/improbable-vs-statistically-impossible/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Optimizing for the developer, not the user.</title>
		<link>http://elliotlovesperl.com/2008/10/02/optimizing-for-the-developer-not-the-user/</link>
		<comments>http://elliotlovesperl.com/2008/10/02/optimizing-for-the-developer-not-the-user/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 17:39:22 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[bug reporting]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=66</guid>
		<description><![CDATA[Mr. Lester, as usual, with the good stuff. While the example he&#8217;s using is PHP, it seems people didn&#8217;t understand that the point was in general, so there&#8217;s a follow up. Tagged: bug reporting, development<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=66&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Mr. Lester, as usual, with <a href="http://perlbuzz.com/2008/09/optimizing-for-the-developer-not-the-user-php-misses-again.html">the good stuff</a>. While the example he&#8217;s using is PHP, it seems people didn&#8217;t understand that the point was in general, so there&#8217;s <a href="http://perlbuzz.com/2008/10/developer-optimization-redux.html">a follow up</a>.</p>
<br /> Tagged: bug reporting, development <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/66/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/66/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/66/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=66&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/10/02/optimizing-for-the-developer-not-the-user/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>stackoverflow.com</title>
		<link>http://elliotlovesperl.com/2008/09/15/stackoverflow-com/</link>
		<comments>http://elliotlovesperl.com/2008/09/15/stackoverflow-com/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 17:34:22 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[using Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=62</guid>
		<description><![CDATA[I was planning on coming into the office early this morning, but just before I was going to leave, I read Spolsky&#8217;s post and in under a minute found a Perl::Critic related question I felt needed a good answer. Dang, writing good answers takes time.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=62&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I was planning on coming into the office early this morning, but just before I was going to leave, I read <a href="http://joelonsoftware.com/items/2008/09/15.html">Spolsky&#8217;s post</a> and in under a minute found a <a href="http://stackoverflow.com/questions/51499/any-good-automated-frameworks-for-applying-coding-standards-in-perl">Perl::Critic related question</a> I felt needed a good answer.</p>
<p>Dang, writing good answers takes time.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/62/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/62/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/62/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/62/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/62/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=62&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/09/15/stackoverflow-com/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Managing perl</title>
		<link>http://elliotlovesperl.com/2008/09/11/managing-perl/</link>
		<comments>http://elliotlovesperl.com/2008/09/11/managing-perl/#comments</comments>
		<pubDate>Thu, 11 Sep 2008 17:22:15 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[administration]]></category>
		<category><![CDATA[Strawberry Perl]]></category>
		<category><![CDATA[upgrading]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=59</guid>
		<description><![CDATA[(The lowercase &#8220;p&#8221; perl is what I mean in the title.) There&#8217;s a great new page on the Perl 5 wiki about administering your perl installation. It includes quite a number of things I believe in. Some of the more significant bits: First and foremost thing I can say is if you depend heavily on [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=59&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>(The <a href="http://www.perlfoundation.org/perl5/index.cgi?perl_vs_perl">lowercase &#8220;p&#8221; perl</a> is what I mean in the title.)</p>
<p>There&#8217;s a <a href="http://www.perlfoundation.org/perl5/index.cgi?perl_best_admin_practices">great new page</a> on the Perl 5 wiki about administering your perl installation. It includes quite a number of things I believe in. Some of the more significant bits:</p>
<blockquote><p>
First and foremost thing I can say is if you depend heavily on Perl (or any single piece of technology) build it yourself. This will allow you finer control and faster upgrades than your OS vendor can. Windows is the exception, <a href="http://www.perlfoundation.org/perl5/index.cgi?strawberry_perl">Strawberry Perl</a> does a much better job packaging Perl and tweaking it for Windows than you can (and if you think you can better, please contribute to Strawberry).
</p></blockquote>
<p>This is <a href="http://blog.vipul.net/2008/08/24/redhat-perl-what-a-tragedy/">especially true</a> on Red Hat. Ignoring general management issues, you really ought to have a threaded and a non-threaded perl so that single-threaded code doesn&#8217;t pay the overhead for threads.</p>
<blockquote><p>
Fourth, <strong>keep up to date</strong>. This means keeping CPAN modules and perl itself at or near the latest versions. This will incur the occasional breakage as you encounter either intermittent bugs in new versions of CPAN modules, or API changes, or project code that accidentally depends on certain versions of CPAN modules. But it&#8217;s worth it, because the farther you fall behind the harder it becomes to catch up. As your perl gets older and older, fewer and fewer CPAN modules will work requiring more and more patching to get them working. As your CPAN modules get older, it will require a greater leap to bring them up to date, and more upgrades simultaneously. The sudden upgrade will cause many bugs to happen simultaneously making them take far more time and effort to track down then if they could be dealt with individually. Large upgrades require large effort, time and risks. Small upgrades require small effort, time and risks. The looming risk of a large upgrade will make developers settle for an older, buggier, less capable version and write a work around rather than risk the upgrade. This creates a hidden drag on your project and creates more and more complex code to maintain.
</p></blockquote>
<p>Another point: when you discover a bug in a CPAN module, there may be a fix for it, but if you&#8217;re very out of date with it, it may cause significant problems with other modules, making your upgrade of that one module really painful.</p>
<p>At Barclay&#8217;s, it took me 7 months to upgrade them from perl 5.6 to 5.8 and the latest version of other modules. Way too long.</p>
<p>If you&#8217;ve got good test coverage, you should be able to easily find any problems with upgrades.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/59/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/59/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/59/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/59/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/59/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=59&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/09/11/managing-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Names</title>
		<link>http://elliotlovesperl.com/2008/09/10/names/</link>
		<comments>http://elliotlovesperl.com/2008/09/10/names/#comments</comments>
		<pubDate>Wed, 10 Sep 2008 17:15:49 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=56</guid>
		<description><![CDATA[A topic anyone who&#8217;s known my programming style for a while knows that this is one of my pet peeves. Why can&#8217;t people use understandable variable names? I just got though producing a set of constants for FIX message types and fields. I hate abbreviations that come from outside the problem domain, i.e. that an [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=56&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>A topic anyone who&#8217;s known my programming style for a while knows that this is one of my pet peeves. Why can&#8217;t people use understandable variable names?</p>
<p>I just got though producing a set of constants for <a href="http://www.fixprotocol.org/">FIX</a> message types and fields. I hate abbreviations that come from outside the problem domain, i.e. that an end user wouldn&#8217;t understand. I hate abbreviations in general, but specifically for &#8220;number&#8221; because there&#8217;s three different common ones in use. FIX uses two of them, with no clear reason for the difference.</p>
<p>In the world of finance, &#8220;FX&#8221; is a reasonable abbreviation to use in names, because the end users understand what it means. In FIX, there&#8217;s a field called &#8220;DKReason&#8221;; care to guess what &#8220;DK&#8221; stands for? If you said you &#8220;don&#8217;t know&#8221;, you&#8217;re correct. Yes, it literally stands for &#8220;don&#8217;t know&#8221;. The description for the field is &#8220;Reason for execution rejection.&#8221;, but if you&#8217;re reading through unfamiliar code and see &#8220;DKReason&#8221;, how the hell are you expected to understand the significance without hours of digging?</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/56/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/56/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/56/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/56/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/56/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=56&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/09/10/names/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Crud. CPAN::Site is unfixably broken.</title>
		<link>http://elliotlovesperl.com/2008/09/09/crud-cpansite-is-unfixably-broken/</link>
		<comments>http://elliotlovesperl.com/2008/09/09/crud-cpansite-is-unfixably-broken/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 17:11:27 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[CPAN::Site]]></category>
		<category><![CDATA[darkpan]]></category>
		<category><![CDATA[ExtUtils::MakeMaker]]></category>
		<category><![CDATA[modules]]></category>
		<category><![CDATA[MyCPAN::Indexer]]></category>
		<category><![CDATA[PPI]]></category>
		<category><![CDATA[Test::Object]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.com/?p=53</guid>
		<description><![CDATA[I&#8217;m setting up a DarkPAN at work. CPAN::Site does most of what I want with maintaining it. Unfortunately, it has some bugs with parsing module versions (in particular Test::Object, which is a blocker for PPI); in particular, it can&#8217;t distinguish between namespace declarations in actual code and in code examples in documentation. I thought that [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=53&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m setting up a DarkPAN at work.</p>
<p>CPAN::Site does most of what I want with maintaining it. Unfortunately, it has some bugs with parsing module versions (in particular Test::Object, which is a blocker for PPI); in particular, it can&#8217;t distinguish between namespace declarations in actual code and in code examples in documentation. I thought that it could be worked around, but in reading source, it&#8217;s doing some pretty incredible stuff.</p>
<p>It&#8217;s reading perl code straight out of raw tar files. It ungzips the tarballs, but doesn&#8217;t untar them. It simply tries to find perl code in the middle of the tar stream and grab the versions out that. Yech.</p>
<p>So, looks like I&#8217;m going to be forced to go back to CPAN::Mini::Inject, <a href="http://www.cpan.org/modules/04pause.html#conventions">taking advantage of parse_version() in ExtUtils::MakeMaker</a>. I&#8217;m going to have to have a look at <a href="http://use.perl.org/~brian_d_foy/journal/37375">brian d foy&#8217;s MyCPAN::Indexer work</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/53/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/53/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=53&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/09/09/crud-cpansite-is-unfixably-broken/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Perl::Critic policies in the DarkPAN.</title>
		<link>http://elliotlovesperl.com/2008/05/05/perlcritic-policies-in-the-darkpan/</link>
		<comments>http://elliotlovesperl.com/2008/05/05/perlcritic-policies-in-the-darkpan/#comments</comments>
		<pubDate>Mon, 05 May 2008 19:05:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[policy development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=25</guid>
		<description><![CDATA[I&#8217;m curious about any people who&#8217;ve written custom Perl::Critic policies that aren&#8217;t on CPAN. What sorts of things are these for? Have you had a look at Perl::Critic 1.082? Have you read Perl::Critic::DEVELOPER? What do you think? This post originally appeared at use.perl.org.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=25&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m curious about any people who&#8217;ve written custom Perl::Critic policies that aren&#8217;t on CPAN.</p>
<p>
What sorts of things are these for?</p>
<p>
Have you had a look at Perl::Critic 1.082?  Have you read <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/DEVELOPER.pod">Perl::Critic::DEVELOPER</a>? What do you think?</p>
<p>
This post originally appeared at <a href="http://use.perl.org/~elliot/journal/36331">use.perl.org</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/25/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/25/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/25/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/25/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/25/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=25&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/05/05/perlcritic-policies-in-the-darkpan/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>The single most useful perlcritic command-line option.</title>
		<link>http://elliotlovesperl.com/2008/03/23/the-single-most-useful-perlcritic-command-line-option/</link>
		<comments>http://elliotlovesperl.com/2008/03/23/the-single-most-useful-perlcritic-command-line-option/#comments</comments>
		<pubDate>Sun, 23 Mar 2008 16:32:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[using Perl::Critic]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=21</guid>
		<description><![CDATA[For me, it&#8217;s --single-policy. Generally, Perl::Critic is being used indirectly via a test using Test::P::C or Test::P::C::Progressive, with a perlcriticrc file that is in the distribution&#8217;s t/ directory. The most common reason I have for running perlcritic is when there&#8217;s a Test::P::C::Progressive failure. In that case, I&#8217;m looking for violations of an individual policy to [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=21&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>For me, it&#8217;s <code>--single-policy</code>.</p>
<p>
Generally, Perl::Critic is being used indirectly via a test using Test::P::C or Test::P::C::Progressive, with a <code>perlcriticrc</code> file that is in the distribution&#8217;s <code>t/</code> directory.</p>
<p>
The most common reason I have for running <code>perlcritic</code> is when there&#8217;s a Test::P::C::Progressive failure.  In that case, I&#8217;m looking for violations of an individual policy to fix to get the violation count down.</p>
<p>
<code>--single-policy</code> overrides all other selection criteria for policies.  Its value, like the ones for the <code>--include</code> and <code>--exclude</code> options, is used as a regex applied against policy names with the /i, /m, and /x options applied to it.  So, for example, if I want to scan for violations of Modules::RequireNoMatchVarsWithUseEnglish in the current directory, I can simply say</p>
<p>
<code>    perlcritic --single-policy english .</code></p>
<p>
When cleaning up a body of code, I find it easier to fix one kind of problem at a time in a bunch of files, rather than fixing all kinds of problems a single file at a time.</p>
<p>
This post originally appeared at <a href="http://use.perl.org/~elliot/journal/35963">use.perl.org</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/21/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/21/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/21/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/21/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/21/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=21&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2008/03/23/the-single-most-useful-perlcritic-command-line-option/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Writing configurable Perl::Critic Policies.</title>
		<link>http://elliotlovesperl.com/2007/09/16/writing-configurable-perlcritic-policies/</link>
		<comments>http://elliotlovesperl.com/2007/09/16/writing-configurable-perlcritic-policies/#comments</comments>
		<pubDate>Mon, 17 Sep 2007 01:55:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[policy development]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=13</guid>
		<description><![CDATA[As of Perl::Critic 1.07, I would like to discourage the creation of constructors for Policies. Instead, I would encourage the use of P::C::Policy::initialize_if_enabled(). The reasoning is twofold. One, this allows initialization to be deferred to the point where we know that the policy is going to be used. P::C::PolicyFactory always instantiates every Policy that it [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=13&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>As of <a href="http://search.cpan.org/dist/Perl-Critic/">Perl::Critic</a> 1.07, I would like to discourage the creation of constructors for Policies.  Instead, I would encourage the use of <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy.pm#initialize_if_enabled">P::C::Policy::initialize_if_enabled()</a>.  The reasoning is twofold.
</p>
<p>
One, this allows initialization to be deferred to the point where we know that the policy is going to be used.  P::C::PolicyFactory always instantiates every Policy that it can find.  It is up to the P::C::Config object to filter that set down.  Primarily, this is an issue for Policies which dynamically load other modules.
</p>
<p>
Two, this method enables the Policy to decide for itself whether it should be enabled.  This means that a Policy that depends upon a module that might not be present can remove itself from the set that violates() gets called on, thus speeding things up because it isn&#8217;t being called on every <a href="http://search.cpan.org/dist/PPI/lib/PPI/Element.pm">PPI::Element</a>.
</p>
<p>
This originated from <a href="http://use.perl.org/~ChrisDolan/">Chris Dolan&#8217;s</a> work on the Perl Foundation grant to create the remaining Policies that can be implemented that enforce one of the ideas in <a href="http://www.perlfoundation.org/perl5/index.cgi?PBP">PBP</a>.  Specifically, for <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/Documentation/PodSpelling.pm">Documentation::PodSpelling</a>, but this change has been made to all the configurable core Policies.  In particular, this helps <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/CodeLayout/RequireTidyCode.pm">CodeLayout::RequireTidyCode</a>.
</p>
<p>
Differences from a constructor other than the obvious first parameter:
</p>
<ol>
<li>The configuration is passed in as <strike>a hashref and not a hash</strike> an instance of <a href="http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/PolicyConfig.pm">Perl::Critic::PolicyConfig</a> (corrected 2009/5/16).</li>
<li>initialize_if_enabled() returns a boolean specifying whether the Policy should be enabled.</li>
</ol>
<p>
This is how the two above policies bow out.
</p>
<p>This post originally appeared at <a href="http://use.perl.org/~elliot/journal/34470">use.perl.org</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/13/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/13/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/13/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/13/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/13/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=13&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2007/09/16/writing-configurable-perlcritic-policies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
		<item>
		<title>Lesson of the day: Readonly, Exporter, and subroutine sigils</title>
		<link>http://elliotlovesperl.com/2007/09/07/lesson-of-the-day-readonly-exporter-and-subroutine-sigils/</link>
		<comments>http://elliotlovesperl.com/2007/09/07/lesson-of-the-day-readonly-exporter-and-subroutine-sigils/#comments</comments>
		<pubDate>Fri, 07 Sep 2007 17:04:00 +0000</pubDate>
		<dc:creator>elliotlovesperl</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Exporter]]></category>
		<category><![CDATA[Perl::Critic]]></category>
		<category><![CDATA[Readonly]]></category>

		<guid isPermaLink="false">http://elliotlovesperl.wordpress.com/?p=3</guid>
		<description><![CDATA[They don&#8217;t get along. As of the recent 1.07 release, Perl::Critic, has started using Readonly to be more more self-compliant with Perl Best Practices. We had been avoiding use of constant for the reasons described in the book, but had not been willing to add the Readonly dependency until now. The Perl::Critic coding standard has [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=3&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>They don&#8217;t get along.</p>
<p>
As of the recent 1.07 release, <code>Perl::Critic</code>, has started using <code>Readonly</code> to be more more self-compliant with <cite>Perl Best Practices</cite>.  We had been avoiding use of <code>constant</code> for the reasons described in the book, but had not been willing to add the <code>Readonly</code> dependency until now.</p>
<p>
The <code>Perl::Critic</code> coding standard has been to use sigils for subroutines in <code>@EXPORT_OK</code>, etc. and import lists, but <code>Exporter</code> treats them as optional.  And, in fact, there&#8217;s code that strips them off (line 47 in v5.58).  I haven&#8217;t figured out the commonality, but in a few environments, this fails spectacularly.  Once we removed the subroutine sigils from everywhere, the problems have gone.</p>
<p>
Explicitness: 0, Keyboard laziness: 1.</p>
<p>
This post originally appeared at <a href="http://use.perl.org/~elliot/journal/34377">use.perl.org</a>.</p>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/elliotlovesperl.wordpress.com/3/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/elliotlovesperl.wordpress.com/3/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/elliotlovesperl.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/elliotlovesperl.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/elliotlovesperl.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=elliotlovesperl.com&amp;blog=7775865&amp;post=3&amp;subd=elliotlovesperl&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://elliotlovesperl.com/2007/09/07/lesson-of-the-day-readonly-exporter-and-subroutine-sigils/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/e2e2e6430cc24b91f3c25f25fba6d9e6?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">elliotlovesperl</media:title>
		</media:content>
	</item>
	</channel>
</rss>
