<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>&#36339;&#12397;&#36796;&#12416;&#12398;&#26085;&#35352; - hanekomu's Perl blog   </title>
    <link>http://hanekomu.at/blog</link>
    <description>&#36339;&#12397;&#36796;&#12416; - hanekomu's Perl blog.</description>
    <language>en</language>

<item>
    <title>Plack::Middleware::Debug</title>
    <pubDate>Sun, 13 Dec 2009 12:04:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/dev/20091213-1204-plack_middleware_debug.html</link>
    <description>&lt;p&gt;I wrote and released a new middleware for Plack: &lt;a href=&quot;http://search.cpan.org/dist/Plack-Middleware-Debug/&quot;&gt;Plack::Middleware::Debug&lt;/a&gt;. It was on miyagawa's wishlist for
Plack and is based heavily on the Django Debug Toolbar. miyagawa also helped to
get this middleware in proper shape to play nicely with the rest of Plack.&lt;/p&gt;

&lt;p&gt;Here is an example of how to use it. Put this in your
&lt;code&gt;app.psgi&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;Plack::Builder&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;File::Basename&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$app&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;sub&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;...&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;};&lt;/span&gt;

&lt;span class=&quot;word&quot;&gt;builder&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;word&quot;&gt;enable&lt;/span&gt; &lt;span class=&quot;single&quot;&gt;'Debug'&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;panels&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&amp;gt;&lt;/span&gt;
        &lt;span class=&quot;structure&quot;&gt;[&lt;/span&gt; &lt;span class=&quot;words&quot;&gt;qw(Environment Response Timer Memory DBITrace)&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;];&lt;/span&gt;
    &lt;span class=&quot;symbol&quot;&gt;$app&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;structure&quot;&gt;};&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The debug middleware offers a configurable set of panels that displays
information about the current request and response. The information is
generated only for responses with a status of 200 (&lt;code&gt;OK&lt;/code&gt;) and a
&lt;code&gt;Content-Type&lt;/code&gt; that contains &lt;code&gt;text/html&lt;/code&gt; and is embedded
in the HTML that is sent back to the browser.&lt;/p&gt;

&lt;p&gt;If you pass a list of panel base names to the &lt;code&gt;enable()&lt;/code&gt; call,
only those panels will be enabled. If you don't pass an argument, the default
list of panels &amp;mdash; &lt;code&gt;Environment&lt;/code&gt;, &lt;code&gt;Response&lt;/code&gt;,
&lt;code&gt;Timer&lt;/code&gt; and &lt;code&gt;Memory&lt;/code&gt; &amp;mdash; will be enabled.&lt;/p&gt;

&lt;p&gt;As of version 0.01, the following panels are available:&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;&lt;code&gt;DBITrace&lt;/code&gt; display DBI trace information.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;Environment&lt;/code&gt; displays the PSGI environment from the
request.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;Memory&lt;/code&gt; displays memory usage before the request and after the
response.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;ModuleVersions&lt;/code&gt; displays the loaded modules and their
versions.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;PerlConfig&lt;/code&gt; displays the configuration information of the Perl
interpreter itself.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;Response&lt;/code&gt; displays the status code and response headers.&lt;/li&gt;

&lt;li&gt;&lt;code&gt;Timer&lt;/code&gt; displays how long the request took.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;The following two screenshots demonstrate the &lt;code&gt;DBITrace&lt;/code&gt; and
&lt;code&gt;Environment&lt;/code&gt; panels.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/hanekomu/4180466509/&quot;
title=&quot;Plack::Middleware::Debug::DBITrace by hanekomu, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2525/4180466509_955641c703_o_d.jpg&quot;
width=&quot;703&quot; height=&quot;554&quot; alt=&quot;Plack::Middleware::Debug::DBITrace&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/hanekomu/4181230948/&quot;
title=&quot;Plack::Middleware::Debug::Environment by hanekomu, on Flickr&quot;&gt;&lt;img
src=&quot;http://farm3.static.flickr.com/2646/4181230948_5acaa3f48d_o_d.jpg&quot;
width=&quot;703&quot; height=&quot;554&quot; alt=&quot;Plack::Middleware::Debug::Environment&quot; /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You could use the power of the debug toolbar for your own framework or web
application. It is quite easy to write custom panels. Just subclass
&lt;code&gt;Plack::Middleware::Debug::Base&lt;/code&gt;, then use your panel in the
&lt;code&gt;enable()&lt;/code&gt; call.&lt;/p&gt;

&lt;p&gt;If you are interested, join us on #plack on irc.perl.org. The &lt;a
href=&quot;http://github.com/hanekomu/plack-middleware-debug/&quot;&gt;development
repository&lt;/a&gt; is on GitHub.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/dev/20091213-1204-plack_middleware_debug.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/dev/20091213-1204-plack_middleware_debug.rss', 'Plack::Middleware::Debug')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>HTML stack trace from the Perl debugger</title>
    <pubDate>Tue, 20 Oct 2009 22:09:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/dev/20091020-2209-html_stacktrace_from_the_perl_debugger.html</link>
    <description>&lt;p&gt;Tatsuhiko Miyagawa released &lt;a href=&quot;http://search.cpan.org/dist/Devel-StackTrace-AsHTML/&quot;&gt;Devel::StackTrace::AsHTML&lt;/a&gt;
and &lt;a
href=&quot;http://bulknews.typepad.com/blog/2009/10/develstacktraceashtml.html&quot;&gt;blogged&lt;/a&gt;
about it.&lt;/p&gt;

&lt;p&gt;I thought this would make a neat Perl debugger command, so I wrote &lt;a href=&quot;http://search.cpan.org/dist/DB-Pluggable-StackTraceAsHTML/&quot;&gt;DB::Pluggable::StackTraceAsHTML&lt;/a&gt;. It is a plugin to &lt;a href=&quot;http://search.cpan.org/dist/DB-Pluggable/&quot;&gt;DB::Pluggable&lt;/a&gt;. It adds the &lt;code&gt;Th&lt;/code&gt; command to the
debugger, which displays a stack trace in HTML format, with lexical variables.
It then opens the page in the default browser.&lt;/p&gt;

&lt;p&gt;Here is an example of how to use it:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;
$ perl -d test.pl

Loading DB routines from perl5db.pl version 1.3
Editor support available.

Enter h or `h h&amp;#39; for help, or `man perldebug&amp;#39; for more help.

main::(test.pl:14): my $n = 12;
  DB&amp;lt;1&amp;gt; r                                                                                                   main::fib(test.pl:12):      return fib($i - 1) + fib($i - 2);
  DB&amp;lt;1&amp;gt; Th                                                                                                  
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The result would look something like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/images/misc/DB-Pluggable-StackTraceAsHTML-screenshot.png&quot;&gt;&lt;/p&gt;

&lt;p&gt;To enable the plugin, just add it to your &lt;code&gt;~/.perldb&lt;/code&gt;, like so:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;DB::Pluggable&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;YAML&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;symbol&quot;&gt;$DB::PluginHandler&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;DB::Pluggable&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;new&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;config&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;Load&lt;/span&gt; &lt;span class=&quot;heredoc&quot;&gt;&amp;lt;&amp;lt;EOYAML&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;heredoc_content&quot;&gt;global:
  log:
    level: error

plugins:
  - module: BreakOnTestNumber
  - module: StackTraceAsHTML
&lt;/span&gt;&lt;span class=&quot;heredoc_terminator&quot;&gt;EOYAML
&lt;/span&gt;
&lt;span class=&quot;symbol&quot;&gt;$DB::PluginHandler&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;run&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;By the way, to be minimally invasive to the existing Perl debugger, the
command is defined using the debugger's aliasing mechanism. Normally you define
an alias as a regular expression that will change the command the user enters
to a known command, but here we circumvent that and call our command handler
directly. The following method is from &lt;code&gt;DB::Pluggable::Plugin&lt;/code&gt;:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;sub&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;make_command&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$cmd_name&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$code&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;magic&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;no&lt;/span&gt; &lt;span class=&quot;pragma&quot;&gt;strict&lt;/span&gt; &lt;span class=&quot;single&quot;&gt;'refs'&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$sub_name&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;double&quot;&gt;&amp;quot;DB::cmd_$cmd_name&amp;quot;&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;cast&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;$sub_name&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$code&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;symbol&quot;&gt;$DB::alias&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;$cmd_name&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;double&quot;&gt;&amp;quot;/./; &amp;amp;$sub_name;&amp;quot;&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To define a new &lt;code&gt;foo&lt;/code&gt; command in a plugin, you then use:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;package&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;DB::Pluggable::StackTraceAsHTML&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;pragma&quot;&gt;strict&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;pragma&quot;&gt;warnings&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;use&lt;/span&gt; &lt;span class=&quot;pragma&quot;&gt;base&lt;/span&gt; &lt;span class=&quot;words&quot;&gt;qw(DB::Pluggable::Plugin)&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;

&lt;span class=&quot;keyword&quot;&gt;sub&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;register&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;keyword&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$context&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;magic&quot;&gt;@_&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
    &lt;span class=&quot;symbol&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;make_command&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;(&lt;/span&gt;
        &lt;span class=&quot;word&quot;&gt;foo&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;sub&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;            # ...
&lt;/span&gt;        &lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;structure&quot;&gt;);&lt;/span&gt;
&lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/dev/20091020-2209-html_stacktrace_from_the_perl_debugger.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/dev/20091020-2209-html_stacktrace_from_the_perl_debugger.rss', 'HTML stack trace from the Perl debugger')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>Repeatedly installing Task::* distributions</title>
    <pubDate>Mon, 05 Oct 2009 12:27:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/dev/20091005-1227-repeatedly_installing_task_distributions.html</link>
    <description>&lt;p&gt;First there were &lt;code&gt;Bundle::*&lt;/code&gt; distributions to install several
dependencies at once without the actual bundle distribution doing anything,
but this required magic in the toolchain. A newer concept is that of a
&lt;code&gt;Task::*&lt;/code&gt; distribution, as described in &lt;a href=&quot;http://search.cpan.org/dist/Task/&quot;&gt;Task&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Task modules are just normal Perl modules; they don't require toolchain
magic. When the dependencies listed in &lt;code&gt;Makefile.PL&lt;/code&gt; have been
installed, the actual Task module, for example &lt;a href=&quot;http://search.cpan.org/dist/Task-Catalyst/&quot;&gt;Task::Catalyst&lt;/a&gt;, will be installed as well.&lt;/p&gt;

&lt;p&gt;This is a problem because if the task's dependencies are being updated,
the task module needs to be updated as well. For example, &lt;a href=&quot;http://search.cpan.org/dist/DBD-SQLite/&quot;&gt;DBD::SQLite&lt;/a&gt; is a dependency of
&lt;code&gt;Task::Catalyst&lt;/code&gt;. If there is a new version of
&lt;code&gt;DBD::SQLite&lt;/code&gt;, just running
&lt;code&gt;install&amp;nbsp;Task::Catalyst&lt;/code&gt; in the CPAN shell won't have any
effect, because the CPAN shell will see that the latest version of
&lt;code&gt;Task::Catalyst&lt;/code&gt; is already installed. Of course you can force
with &lt;code&gt;force install Task::Catalyst&lt;/code&gt;, but even if that would
work, it would be ugly because I don't want to install dependencies that
fail their tests.&lt;/p&gt;

&lt;p&gt;One solution is to prevent the task module itself to be installed. That
way, every time you rerun &lt;code&gt;install&amp;nbsp;Task::Foo&lt;/code&gt; in the CPAN
shell, it will see that the task module isn't installed and try to install
it again, with all the desired dependency checking.&lt;/p&gt;

&lt;p&gt;How do we prevent the module from being installed? Put these lines in
your &lt;code&gt;Makefile.PL&lt;/code&gt; &amp;mdash; I always use &lt;a href=&quot;http://search.cpan.org/dist/Module-Install/&quot;&gt;Module::Install&lt;/a&gt;, but I think this should work for all
&lt;code&gt;MakeMaker&lt;/code&gt;-based files:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;word&quot;&gt;exit&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$ENV&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;AUTOMATED_TESTING&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;};&lt;/span&gt;
&lt;span class=&quot;keyword&quot;&gt;sub&lt;/span&gt; &lt;span class=&quot;word&quot;&gt;MY::install&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;double&quot;&gt;&amp;quot;install ::\n&amp;quot;&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;First, we don't need to waste the time of CPAN testers by having them
install all the dependencies for a task module that doesn't really do
anything anyway. Second, and more importantly, we override the
&lt;code&gt;install ::&lt;/code&gt; target that is generated for the
&lt;code&gt;Makefile&lt;/code&gt; to effectively be a no-op.&lt;/p&gt;

&lt;p&gt;I have demonstrated this technique in &lt;a href=&quot;http://search.cpan.org/dist/Task-BeLike-hanekomu/&quot;&gt;Task::BeLike::hanekomu&lt;/a&gt;, a somewhat pointless distribution
that serves mainly as proof-of-concept, and as a way to install my
favourite modules onto a new perl installation. If you don't mind the
dependencies, then go ahead and repeatedly run
&lt;code&gt;install&amp;nbsp;Task::BeLike::hanekomu&lt;/code&gt; in the CPAN shell; the
task module itself should never be installed and it should recheck the
dependencies every time.&lt;/p&gt;

&lt;p&gt;I think this would be a good thing to put in existing task distributions
such as &lt;a href=&quot;http://search.cpan.org/dist/Task-Kensho/&quot;&gt;Task::Kensho&lt;/a&gt; and &lt;a href=&quot;http://search.cpan.org/dist/Task-Catalyst/&quot;&gt;Task::Catalyst&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/dev/20091005-1227-repeatedly_installing_task_distributions.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/dev/20091005-1227-repeatedly_installing_task_distributions.rss', 'Repeatedly installing Task::* distributions')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>Text::Pipe trademark controversy</title>
    <pubDate>Thu, 17 Sep 2009 17:37:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/misc/20090917-1737-text_pipe_trademark_controversy.html</link>
    <description>&lt;p&gt;There has been a series of curious emails from a software developer in
Australia who argues that one of my Perl module distributions on CPAN infringe
on his trademark. He has a Windows product called &quot;TextPipe Pro&quot; and thinks
that my Perl module called &lt;a href=&quot;http://search.cpan.org/dist/Text-Pipe/&quot;&gt;Text::Pipe&lt;/a&gt; dilutes his desired
search results.&lt;/p&gt;

&lt;p&gt;It all started in December 2008; I've lost his original mail &amp;mdash; I don't
keep every bit of rubbish some random people send me &amp;mdash; but here is my
reply from that time (I've deleted his last name and all email addresses and
other contact details):&lt;/p&gt;

&lt;pre class=&quot;quote&quot;&gt;
From: Marcel Gr&amp;uuml;nauer
Sent: Tuesday, 16 December 2008 9:42 AM
To: Simon
Subject: Re: Text-Pipe
Importance: High

Hi Simon,

On Dec 15, 2008, at 10:49 PM, Simon wrote:

&amp;gt; I would greatly appreciate it if you could rename your Text-Pipe  
&amp;gt; package to avoid confusion and to prevent dilution of the keywords I  
&amp;gt; use to earn an income.

Sorry, I won't rename my Perl distributions. &quot;Text-Pipe&quot; and its  
related distributions are only found on CPAN and on github and are  
Perl-specific. There are also people who use this package and I don't  
want to inconvenience them by renaming my packages.

It would also be a major undertaking for me as I would have to think  
of a new name, replace the names, create a new repository and import  
the whole history from the old one (you can't rename a repository on  
github), re-uploading all the distributions (there are several related  
ones), notifying everyone and so on.

Also, neither the word &quot;text&quot; nor the word &quot;pipe&quot; express particularly  
novel concepts in software, nor does the combination of the two.  
Regarding keywords: googling for &quot;textpipe&quot;, &quot;text pipe&quot; and &quot;text- 
pipe&quot; lists your software as the top hits, so I don't think you have  
to fear anything from my set of perl modules. Further, I could also  
object that your description &quot;A Swiss Army knife for fixing text&quot;  
dilutes keywords normally referring to Perl.

&quot;Text::Pipe&quot; is not a trademark, nor does it challenge yours.

[...]

Marcel Gr&amp;uuml;nauer
&lt;/pre&gt;

&lt;p&gt;After that, I didn't hear any more from him for nine months, so I forgot all
about it. Until the 17th September 2009, when Simon saw fit to bring up
the topic again:&lt;/p&gt;

&lt;pre class=&quot;quote&quot;&gt;
From: Simon
Subject: RE: Text-Pipe
Date: September 17, 2009 5:29:03 AM GMT+02:00
To: Marcel Gr&amp;uuml;nauer

Hi Marcel,

TextPipe forms my entire income, and supports my wife, our 4 kids, and my
house mortgage.

TextPipe is a registered trademark (in Australia), but yes, I'd probably
have to register it in every country on the planet.

I've been using that name to describe it for over 10 years.

I am simply asking if you could please change your Perl module name to
Text::Filter, Text::Adaptor or something else.

Please reconsider.

Regards,

Simon
&lt;/pre&gt;

&lt;p&gt;I considered. However, a few hours later, he made the questionable move of
contacting my bosses at work about this matter:&lt;/p&gt;

&lt;pre class=&quot;quote&quot;&gt;
Subject: Infringment of trademark TextPipe by Marcel Gr&amp;uuml;nauer
Date: Thu, 17 Sep 2009 12:38:50 +1000
From: Simon
Organisation: DataMystic
To: Marcel's Boss

[...]

I see this growing into a commercial vs free, trademarked vs 'I can do
whatever I like and you can't stop me because I work for a University'
type-war.

I would like you to get Marcel to change the name of his package to
something that does not conflict.

Failing that, I'd like you to mediate, or appoint a mediator from your
department who has worked for a software company, to help resolve this
matter in the best interests of all.

[...]
&lt;/pre&gt;

&lt;p&gt;Now he was beginning to piss me off. I explained to my boss that I developed
this module in my spare time and that we don't even use it at work, and my boss
is cool, so he wrote that back to the guy. I also replied to the guy:&lt;/p&gt;

&lt;pre class=&quot;quote&quot;&gt;
Subject: Re: Text-Pipe
From: Marcel Gr&amp;uuml;nauer
Date: September 17, 2009 2:40:46 PM GMT+02:00
To: Simon

Hi Simon,

[...]

Text-Pipe is a Perl module distribution which I have developed purely in my
private time and it has nothing to do with work; it's not even used in any code
at work. As such I see you writing to my boss(es) as highly inappropriate. It
is also a sure way to get me to not consider any changes.

My boss has spoken to the company's lawyers - basically you don't stand a legal
chance to force me to change it. The lawyers see my original arguments (not
novel concepts, more general terms etc.) as valid as well; they also explicitly
stated that trademark law is not applicable in this particular case. Besides I
don't want to set a precedent for this kind of behavior - there would be no end
to it.

I am pleased to hear that your software financially supports you, your wife,
four children and a mortgage. Therefore let me repeat my original offer (from
nine months ago): If you would like to contract me to make any changes you
like, I can send you my rate card.

Regards,

Marcel Gr&amp;uuml;nauer
&lt;/pre&gt;

&lt;p&gt;At the time of writing this blog entry, the Google link Simon wrote
about in his email would show mostly his software; my module came in third
position on both the first and second page of search results. Maybe he just has
a SEO problem, who knows.&lt;/p&gt;

&lt;p&gt;The reason I'm writing about this at length is that it raises a potential
problem. There are CPAN mirrors in many countries and I guess it would be next
to impossible to make sure that no module name resembles any trademarked name
in every country. So I ask the perl community to discuss this aspect.&lt;/p&gt;

&lt;p&gt;Then something else happened which shows why it is a bad idea to piss off
geeks who run the infrastructure. I discussed the whole matter with the fine
folks on the #london.pm IRC channel when, after it had been noted that &lt;a
href=&quot;http://text-pipe.com&quot;&gt;text-pipe.com&lt;/a&gt; was still available, &lt;a
href=&quot;http://search.cpan.org/~ash/&quot;&gt;Ash Berlin&lt;/a&gt; registered the domain
without further ado and made it to point to the CPAN distribution.&lt;/p&gt;

&lt;p&gt;It is possible that because of this, the ratio of Google search results for
TextPipe Pro and Text::Pipe is going to change. I wonder if Simon is
familiar with the term &lt;a
href=&quot;http://en.wikipedia.org/wiki/Streisand_effect&quot;&gt;Streisand effect&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Note that I have no intention of infringing on anyone's trademark and I have
no desire to take away business from TextPipe Pro. Anyone who is looking for a
Windows text manipulation application will, upon landing on the CPAN web pages,
quickly realize that this isn't what they were looking for and look at other
search results. That being said, I don't take kindly to threats &amp;mdash; however
politely they may be phrased &amp;mdash; and pestering my boss about it is a
certain way to not get on my good side.&lt;/p&gt;

&lt;p&gt;I've also put a link to the TextPipe Pro product web site in the &lt;code&gt;SEE
ALSO&lt;/code&gt; section of all modules of &lt;a href=&quot;http://search.cpan.org/dist/Text-Pipe/&quot;&gt;Text-Pipe&lt;/a&gt; 0.09, so
maybe that'll be ok.&lt;/p&gt;

&lt;p&gt;Anyway, like I wrote, this is a potential concern for the Perl community, so
a discussion about it is welcome.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;&lt;i&gt;Update:&lt;/i&gt;&lt;/b&gt; He sent me another mail asking me to remove the links
to his site again because &quot;this is going to make the current situation worse,
not better&quot;. So I did and uploaded version 0.10&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/misc/20090917-1737-text_pipe_trademark_controversy.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/misc/20090917-1737-text_pipe_trademark_controversy.rss', 'Text::Pipe trademark controversy')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>Easy metadata for CPAN modules</title>
    <pubDate>Mon, 14 Sep 2009 10:13:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/dev/20090914-1013-easy_metadata_for_cpan_modules.html</link>
    <description>&lt;p&gt;Earlier I wrote about &lt;a href=&quot;http://hanekomu.at/blog/dev/20090319-2129-search_cpan_metadata.html&quot;&gt;how to enhance a CPAN
distribution&lt;/a&gt; by including metadata about that distribution's place in its
infrastructure &amp;mdash; where to find its homepage, bug tracker and
repository.&lt;/p&gt;

&lt;p&gt;There are now &lt;a href=&quot;http://search.cpan.org/dist/Module-Install/&quot;&gt;Module::Install&lt;/a&gt; plugins on CPAN that make
this task easier. Tatsuhiko Miyagawa wrote &lt;a href=&quot;http://search.cpan.org/dist/Module-Install-Repository/&quot;&gt;Module::Install::Repository&lt;/a&gt; and I wrote &lt;a href=&quot;http://search.cpan.org/dist/Module-Install-Homepage/&quot;&gt;Module::Install::Homepage&lt;/a&gt; and &lt;a href=&quot;http://search.cpan.org/dist/Module-Install-Bugtracker/&quot;&gt;Module::Install::Bugtracker&lt;/a&gt;. So now your
&lt;code&gt;Makefile.PL&lt;/code&gt; can simply include these lines:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;word&quot;&gt;auto_set_homepage&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;word&quot;&gt;auto_set_bugtracker&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;word&quot;&gt;auto_set_repository&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To set the repository link, your distribution's version control is examined.
The distribution's homepage is set to its page on &lt;a
href=&quot;http://search.cpan.org&quot;&gt;http://search.cpan.org&lt;/a&gt;, and the
distribution's bugtracker is set to its RT queue on &lt;a
href=&quot;http://rt.cpan.org&quot;&gt;http://rt.cpan.org&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/dev/20090914-1013-easy_metadata_for_cpan_modules.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/dev/20090914-1013-easy_metadata_for_cpan_modules.rss', 'Easy metadata for CPAN modules')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>Perl modules past their sell-by date</title>
    <pubDate>Tue, 25 Aug 2009 11:23:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/misc/20090825-1123-perl_modules_past_their_sell_by_date.html</link>
    <description>&lt;p&gt;&lt;a href=&quot;http://pugs.blogs.com/audrey/2009/08/why-such-me.html&quot;&gt;Audrey
wrote&lt;/a&gt; about _why's disappearance and although I have honestly never heard
about _why up until the recent excitement (must not have been popular in my
cave). But there was a quote from _why in her blog post that made me think:&lt;/p&gt;

&lt;p class=&quot;quote&quot;&gt;programming is rather thankless. u see your works become
replaced by superior ones in a year. unable to run at all in a few more.&lt;/p&gt;

&lt;p&gt;That is very true. I have written and uploaded to CPAN quite a number of
Perl module distributions. I obviously found them useful at the time I wrote
them, but the Perl world moves on (rather fast as of late), and most of my
distributions have fallen out of favor.&lt;/p&gt;

&lt;p&gt;So I ask myself why I leave my deprecated distributions on CPAN. I don't
need them anymore, and I certainly don't want to maintain them. I also don't
care about having a three-digit number of CPAN distributions for the sake of
some useless ranking. The modules will turn up as search results, and someone
else might find them useful, but if other people asked me about the module in
question I would probably refer them to some more modern code.&lt;/p&gt;

&lt;p&gt;Just deleting them is proabably not a good idea either because someone might
have the modules in use, though I don't flatter myself &amp;mdash; I'm probably the
only user of most of my code.&lt;/p&gt;

&lt;p&gt;Is there some drop-off account where you can leave unloved modules?&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/misc/20090825-1123-perl_modules_past_their_sell_by_date.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/misc/20090825-1123-perl_modules_past_their_sell_by_date.rss', 'Perl modules past their sell-by date')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>First names in the Perl community</title>
    <pubDate>Mon, 24 Aug 2009 10:15:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/misc/20090824-1015-first_names_in_the_perl_community.html</link>
    <description>&lt;p&gt;There are some names that don't really need further qualifying; the first
name is enough. &quot;Larry&quot;, &quot;Audrey&quot;, &quot;Damian&quot; &amp;mdash; I think that even outside
the Perl world, a lot of people will know who is meant. &quot;Miyagawa&quot; is an
exception, but then in Japan the first name is generally de-emphasized and
instead the given name is used even among colleagues.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/misc/20090824-1015-first_names_in_the_perl_community.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/misc/20090824-1015-first_names_in_the_perl_community.rss', 'First names in the Perl community')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>Signals from Audrey</title>
    <pubDate>Sun, 23 Aug 2009 19:04:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/misc/20090823-1904-signals_from_audrey.html</link>
    <description>&lt;p&gt;Blog replies, &lt;a
href=&quot;http://pugs.blogs.com/audrey/2009/08/why-such-me.html&quot;&gt;blog posts&lt;/a&gt;, &lt;a
href=&quot;http://github.com/audreyt&quot;&gt;github activity&lt;/a&gt; and &lt;a
href=&quot;http://twitter.com/audreyt&quot;&gt;tweets&lt;/a&gt; &amp;mdash; there have been quite a
few signals from Audrey Tang lately. I'm glad Audrey is gradually coming back;
I remember being inspired and awe-struck by her (back then, &quot;his&quot;) brilliance
at an Austrian Perl Workshop.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/misc/20090823-1904-signals_from_audrey.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/misc/20090823-1904-signals_from_audrey.rss', 'Signals from Audrey')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>In defense of polymorphism</title>
    <pubDate>Sat, 15 Aug 2009 13:29:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/dev/20090815-1329-in_defense_of_polymorphism.html</link>
    <description>&lt;p&gt;Laurent Dami blogged &lt;a
href=&quot;http://ldami.blogspot.com/2009/08/object-oriented-accessors-considered.html&quot;&gt;Object-oriented
accessors considered (sometimes) harmful&lt;/a&gt; and Yuval Kogman &lt;a
href=&quot;http://blog.woobling.org/2009/08/in-defense-of-apis.html&quot;&gt;responded&lt;/a&gt;
to it.&lt;/p&gt;

&lt;p&gt;I agree that accessing hash elements directly can be tempting, but for me
the killer argument in favor of accessor methods is polymorphism. Simply put,
if you access hash elements directly, you're effectively making it completely
impossible for someone else to subclass your class, or for your own class to
subclass another class later. That's all.&lt;/p&gt;

&lt;p&gt;And I agree strongly with one of Laurent's criticisms: With accessors, you
never know where things really happen, making them difficult to debug. To use
Laurent's example:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;symbol&quot;&gt;$c&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;request&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;length&lt;/span&gt; &lt;span class=&quot;operator&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span class=&quot;symbol&quot;&gt;$self&lt;/span&gt;&lt;span class=&quot;operator&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;word&quot;&gt;min_body&lt;/span&gt;&lt;span class=&quot;structure&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;structure&quot;&gt;{&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You have to step through a lot of methods to get to the right-hand side.
It's the same with any expression.&lt;/p&gt;

&lt;p&gt;What I would really like in the Perl debugger (but ENOTUITS) is the
possibility to inspect the expression in a precedence-based tree-view like
this:&lt;/p&gt;

&lt;div class=&quot;perlsource&quot;&gt;&lt;pre&gt;
1: &amp;lt;
2:    $c
3:        -&amp;gt;request
4:            -&amp;gt;body
5:                -&amp;gt;length
6:    $self
7:        -&amp;gt;min_body
&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;and then being able to set a one-time breakpoint for line 7, that is, when
entering the &lt;code&gt;min_body()&lt;/code&gt; method.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/dev/20090815-1329-in_defense_of_polymorphism.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/dev/20090815-1329-in_defense_of_polymorphism.rss', 'In defense of polymorphism')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item><item>
    <title>YAPC::Europe 2009 photos</title>
    <pubDate>Fri, 07 Aug 2009 18:00:00 GMT</pubDate>
    <link>http://hanekomu.at/blog/conferences/20090807-1800-yapc_europe_2009-photos.html</link>
    <description>&lt;p&gt;I've created a &lt;a
href=&quot;http://www.flickr.com/photos/hanekomu/sets/72157621810075091/&quot;&gt;photoset&lt;/a&gt;
with 126 photos from YAPC::Europe 2009. Enjoy!&lt;/p&gt;

&lt;p&gt;If you search for the tag &quot;yapceu2009&quot;, you should find more photos from
other conference attendees.&lt;/p&gt;&lt;p&gt;
    &lt;a href=&quot;http://hanekomu.at/blog/conferences/20090807-1800-yapc_europe_2009-photos.html&quot;&gt;Write a comment&lt;/a&gt; | 
&lt;!-- AddThis Button BEGIN --&gt;
&lt;a href=&quot;http://www.addthis.com/bookmark.php?v=250&quot; onmouseover=&quot;return addthis_open(this, '', 'http://hanekomu.at/blog/conferences/20090807-1800-yapc_europe_2009-photos.rss', 'YAPC::Europe 2009 photos')&quot; onmouseout=&quot;addthis_close()&quot; onclick=&quot;return addthis_sendto()&quot;&gt;&lt;img src=&quot;http://s7.addthis.com/static/btn/lg-share-en.gif&quot; width=&quot;125&quot; height=&quot;16&quot; alt=&quot;Bookmark and Share&quot; style=&quot;border:0&quot;/&gt;&lt;/a&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://s7.addthis.com/js/250/addthis_widget.js?pub=hanekomu&quot;&gt;&lt;/script&gt;
&lt;!-- AddThis Button END --&gt;
&lt;/p&gt;

</description>
</item>  </channel>
</rss>