<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>davewood</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/davewood/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/davewood//1085</id>
    <updated>2013-03-07T14:30:45Z</updated>
    <subtitle>A blog about the Perl programming language</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Pro 4.38</generator>

<entry>
    <title>using DBIx::Class::DeploymentHandler</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2013/03/using-dbixclassdeploymenthandler.html" />
    <id>tag:blogs.perl.org,2013:/users/davewood//1085.4398</id>

    <published>2013-03-07T13:41:26Z</published>
    <updated>2013-03-07T14:30:45Z</updated>

    <summary>I used to work with DBIx::Class::Schema::Versioned to upgrade my DBIC Schema but soon I needed more then it offered. Starting with DBIx::Class::DeploymentHandler was a bit troublesome because I had a hard-ish time understanding the extensive documentation. Now that I moved...</summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    <category term="dbixclassdbixclassdeploymenthandlerdatabasemigrationversioningdbixclassschemaversioned" label="DBIx::Class DBIx::Class::DeploymentHandler Database Migration Versioning DBIx::Class::Schema::Versioned" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>I used to work with DBIx::Class::Schema::Versioned to upgrade my DBIC Schema but soon I needed more then it offered.</p>

<p>Starting with DBIx::Class::DeploymentHandler was a bit troublesome because I had a hard-ish time understanding the extensive documentation.</p>

<p>Now that I moved past that phase I want to present my way of using DeploymentHandler and hopefully spare you some of the burden.</p>

<p>Note: I write my DBIC schema resultclasses by hand and deploy to whatever database system I need.</p>

<p>Feature list
* each schema version should be installable to a clean/empty database
* single step upgrades of schema versions
* create pl scripts that do something on the schema before and/or after upgrade</p>

<pre><code> ./script/database.pl 
usage:
  database.pl --cmd prepare [ --from-version $from --to-version $to ]
  database.pl --cmd install [ --version $version ]
  database.pl --cmd upgrade
  database.pl --cmd database-version
  database.pl --cmd schema-version
</code></pre>

<p>Simply create your DBIC schema and once you are ready add</p>

<pre><code>our $VERSION = 1;
</code></pre>

<p>to Schema.pm</p>

<p>Run</p>

<pre><code>database.pl --cmd prepare
</code></pre>

<p>this command creates the following files</p>

<pre><code>db_upgrades/
├── PostgreSQL
│   └── deploy
│       └── 1
│           ├── 001-auto.sql
│           └── 001-auto-__VERSION.sql
└── _source
    └── deploy
        └── 1
            ├── 001-auto-__VERSION.yml
            └── 001-auto.yml
</code></pre>

<p>Run</p>

<pre><code>database.pl --cmd install
</code></pre>

<p>to deploy the schema to your database</p>

<p>Next we change the schema. add a column to a table and increase the schema version to 2.</p>

<p>then run</p>

<pre><code>database.pl --cmd prepare --from-version 1 --to-version 2
</code></pre>

<p>the deployment directory now look like this:</p>

<pre><code>db_upgrades/
├── PostgreSQL
│   ├── deploy
│   │   ├── 1
│   │   │   ├── 001-auto.sql
│   │   │   └── 001-auto-__VERSION.sql
│   │   └── 2
│   │       ├── 001-auto.sql
│   │       └── 001-auto-__VERSION.sql
│   └── upgrade
│       └── 1-2
│           └── 001-auto.sql
└── _source
    └── deploy
        ├── 1
        │   ├── 001-auto-__VERSION.yml
        │   └── 001-auto.yml
        └── 2
            ├── 001-auto-__VERSION.yml
            └── 001-auto.yml
</code></pre>

<p>Sometimes you want to do stuff with your schema before you change the DDL. With DBIx::Class::DeploymentHandler you can run SQL and or PL files before and after changing the DDL.</p>

<p>Since perl scripts are mostly independent of your choice of DBRMS it's best to put them in the special directory _common. Files from _common will be merged with the storage specific files So we have to make sure the file names reflect the order we want them exectuted in.</p>

<p>create directroy</p>

<pre><code>mkdir -p db_upgrades/_common/upgrade/1-2/
</code></pre>

<p>create perl script</p>

<pre><code>touch db_upgrades/_common/upgrade/1-2/001_do_stuff_BEFORE_ddl_change.pl
</code></pre>

<p>rename auto-generated sql file so the perl script is exectured before the DDL change</p>

<pre><code>mv db_upgrades/PostgreSQL//upgrade/1-2/001-auto.sql db_upgrades/PostgreSQL//upgrade/1-2/002-auto.sql

db_upgrades/
├── _common
│   └── upgrade
│       └── 1-2
│           └── 001_do_stuff_BEFORE_ddl_change.pl
├── PostgreSQL
│   ├── deploy
│   │   ├── 1
│   │   │   ├── 002-auto.sql
│   │   │   └── 001-auto-__VERSION.sql
│   │   └── 2
│   │       ├── 001-auto.sql
│   │       └── 001-auto-__VERSION.sql
│   └── upgrade
│       └── 1-2
│           └── 001-auto.sql
└── _source
    └── deploy
        ├── 1
        │   ├── 001-auto-__VERSION.yml
        │   └── 001-auto.yml
        └── 2
            ├── 001-auto-__VERSION.yml
            └── 001-auto.yml
</code></pre>

<p>Here is an example script 001<em>do</em>stuff<em>BEFORE</em>ddl_change.pl</p>

<pre><code>#!/usr/bin/env perl
use strict;
use warnings;

use DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator::ScriptHelpers 'schema_from_schema_loader';

schema_from_schema_loader(
    { naming =&gt; 'current' },
    sub {
        my ( $schema, $versions ) = @_;
        # do stuff with $schema
    }
);
</code></pre>

<p>and finally my database.pl file</p>

<pre><code>#!/usr/bin/env perl

use strict;
use warnings;
use 5.010;
use DBIx::Class::DeploymentHandler;
use feature qw/ switch /;
use Getopt::Long;

my $cmd = '';
my $from_version;
my $to_version;
my $version;
GetOptions(
    'command|cmd|c=s' =&gt; \$cmd,
    'from-version=i'  =&gt; \$from_version,
    'to-version=i'    =&gt; \$to_version,
    'version=i'       =&gt; \$version,
);

sub usage {
    say &lt;&lt;'HERE';
usage:
  database.pl --cmd prepare [ --from-version $from --to-version $to ]
  database.pl --cmd install [ --version $version ]
  database.pl --cmd upgrade
  database.pl --cmd database-version
  database.pl --cmd schema-version
HERE
    exit(0);
}

my $schema = '...'; # wherever you get your schema from.
my $deployment_handler_dir = './db_upgrades'

my $dh = DBIx::Class::DeploymentHandler-&gt;new(
    {   schema           =&gt; $schema,
        script_directory =&gt; $deployment_handler_dir,
        databases        =&gt; 'PostgreSQL',
        force_overwrite  =&gt; 1,
    }
);

die "We only support positive integers for versions."
    unless $dh-&gt;schema_version =~ /^\d+$/;

for ($cmd) {
    when ('prepare')          { prepare() }
    when ('install')          { install() }
    when ('upgrade')          { upgrade() }
    when ('database-version') { database_version() }
    when ('schema-version')   { schema_version() }
    default                   { usage() }
}

sub prepare {
    say "running prepare_install()";
    $dh-&gt;prepare_install;

    if ( defined $from_version &amp;&amp; defined $to_version ) {
        say
            "running prepare_upgrade({ from_version =&gt; $from_version, to_version =&gt; $to_version })";
        $dh-&gt;prepare_upgrade(
            {   from_version =&gt; $from_version,
                to_version   =&gt; $to_version,
            }
        );
    }
}

sub install {
    if ( defined $version ) {
        $dh-&gt;install({ version =&gt; $version });
    }
    else {
        $dh-&gt;install;
    }
}

sub upgrade {
    $dh-&gt;upgrade;
}

sub database_version {
    say $dh-&gt;database_version;
}

sub schema_version {
    say $dh-&gt;schema_version;
}
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>Nginx: FastCGI vs. starman (Erratum)</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2013/01/nginx-fastcgi-vs-starman-erratum.html" />
    <id>tag:blogs.perl.org,2013:/users/davewood//1085.4186</id>

    <published>2013-01-09T08:37:19Z</published>
    <updated>2013-01-09T09:05:47Z</updated>

    <summary><![CDATA[2 weeks ago I've written Moving my Catalyst Apps from Apache/FCGI to Nginx/Starman Yesterday I have discussed my setup with mst, jnap and joel on irc.perl.org #catalyst Here is the gist of what mst had to say. 15:50 &lt;@mst> you're...]]></summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    <category term="catalystnginxstarmanfastcgideploymentplack" label="Catalyst Nginx Starman FastCGI Deployment Plack" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>2 weeks ago I've written <a href="http://blogs.perl.org/users/davewood/2012/12/moving-my-catalyst-apps-from-apachefcgi-to-nginxstarman.html">Moving my Catalyst Apps from Apache/FCGI to Nginx/Starman</a></p>

<p>Yesterday I have discussed my setup with mst, jnap and joel on irc.perl.org #catalyst</p>

<p>Here is the gist of what mst had to say.</p>

<blockquote>
  <p>15:50 &lt;@mst> you're using unix sockets <br />
15:50 &lt;@mst> ergo there's no gain to using starman over fastcgi, you're just using a less efficient protocol <br />
15:51 &lt;@mst> the modern <em>ways</em> are starman via http TCP proxy, and fastcgi via unix socket <br />
15:51 &lt;@mst> you're currently using starman to emulate myapp_fastcgi.pl <br />
15:51 &lt;@mst> and I can't see the point  </p>
</blockquote>

<p>Here is another post about the same topic.
<a href="http://stackoverflow.com/questions/4003714/nginx-and-perl-fastcgi-vs-reverse-proxy-psgi-starman">nginx and Perl: FastCGI vs reverse proxy</a> Forget the last downside bullet from the first reply though. thats bogus.</p>

<p>Here is my new setup (debian wheezy, stick to the <a href="http://search.cpan.org/~hkclark/Catalyst-Manual-5.9006/lib/Catalyst/Manual/Deployment/nginx/FastCGI.pod">official deployment instructions</a> if you run into problems with my config)</p>

<p><a href="https://github.com/davewood/Soundgarden/blob/master/nginx.fcgi.conf">nginx</a></p>

<pre><code>server {
    listen 80;
    server_name soundgarden.com *.soundgarden.com;
    client_max_body_size 50m;

    location / {
      include /etc/nginx/fastcgi_params;
      fastcgi_param SCRIPT_NAME '';
      fastcgi_param PATH_INFO $fastcgi_script_name;
      fastcgi_pass unix:/var/www/Soundgarden/soundgarden.socket;
    }

    location /static {
      root /var/www/Soundgarden/root;
      expires 30d;
    }
}
</code></pre>

<p><a href="https://github.com/davewood/Soundgarden/blob/master/soundgarden.fcgi.initd">initd</a></p>

<pre><code>#!/usr/bin/env perl
use warnings;
use strict;
use Daemon::Control;

# 1) create initd file
# ./soundgarden.starman.initd get_init_file &gt; foo
#
# 2) copy to /etc/init.d/cat-soundgarden
# cp foo /etc/init.d/cat-soundgarden
#
# 3) install to runlevels
# update-rc.d cat-soundgarden defaults


my $app_home = '/var/www/Soundgarden';
my $perl     = '/var/www/perl5/perlbrew/perls/perl-5.16.2/bin/perl';
my $program  = $app_home . '/script/soundgarden_fastcgi.pl';
my $name     = 'Soundgarden';
my $workers  = 1;
my $pid_file = $app_home . '/soundgarden.pid';
my $socket   = $app_home . '/soundgarden.socket';

Daemon::Control-&gt;new({
    name        =&gt; $name,
    lsb_start   =&gt; '$nginx',
    lsb_stop    =&gt; '$nginx',
    lsb_sdesc   =&gt; $name,
    lsb_desc    =&gt; $name,
    path        =&gt; $app_home . '/soundgarden.fastcgi.initd',

    user        =&gt; 'www-data',
    group       =&gt; 'www-data',
    directory   =&gt; $app_home,
    program     =&gt; "$perl $program --nproc $workers --listen $socket",

    pid_file    =&gt; $pid_file,
    stderr_file =&gt; $app_home . '/soundgarden.out',
    stdout_file =&gt; $app_home . '/soundgarden.out',

    fork        =&gt; 2,
})-&gt;run;
</code></pre>
]]>
        

    </content>
</entry>

<entry>
    <title>Moving my Catalyst Apps from Apache/FCGI to Nginx/Starman</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2012/12/moving-my-catalyst-apps-from-apachefcgi-to-nginxstarman.html" />
    <id>tag:blogs.perl.org,2012:/users/davewood//1085.4158</id>

    <published>2012-12-28T10:34:30Z</published>
    <updated>2012-12-28T12:01:38Z</updated>

    <summary>Recently I had to move all my projects to a new server and decided to give Nginx and Starman a chance. The Nginx config is rather simple. my Catalyst Application is located at /var/www/MyApp server { listen 80; server_name myapp.at...</summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    <category term="catalystnginxstarmandeploymentplack" label="Catalyst Nginx Starman Deployment Plack" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>Recently I had to move all my projects to a new server and decided to give Nginx and Starman a chance.</p>

<p>The Nginx config is rather simple.</p>

<p>my Catalyst Application is located at /var/www/MyApp</p>

<pre><code>server {
    listen 80;
    server_name myapp.at *.myapp.at;

    location / {
      include /etc/nginx/proxy_params;
      proxy_pass http://unix:/var/www/MyApp/myapp.socket:/;
    }

    location /static {
      root /var/www/MyApp/root;
      expires 30d;
    }
}
</code></pre>

<p>Nginx expects the Catalyst Application to listen on the socket /var/www/MyApp/myapp.socket.</p>

<p>Here is my initd script that takes care of starting and stopping the starman processes. (/var/www/MyApp/myapp.starman.initd)</p>

<pre><code>#!/usr/bin/env perl
use warnings;
use strict;
use Daemon::Control;

my $app_home = '/var/www/MyApp';
my $program  = '/var/www/perl5/perlbrew/perls/perl-5.16.2/bin/starman';
my $name     = 'MyApp';
my $workers  = 1;
my $pid_file = $app_home . '/myapp.pid';
my $socket   = $app_home . '/myapp.socket';

Daemon::Control-&gt;new({
    name        =&gt; $name,
    lsb_start   =&gt; '$nginx',
    lsb_stop    =&gt; '$nginx',
    lsb_sdesc   =&gt; $name,
    lsb_desc    =&gt; $name,
    path        =&gt; $app_home . '/myapp.starman.initd',

    user        =&gt; 'www-data',
    group       =&gt; 'www-data',
    directory   =&gt; $app_home,
    program     =&gt; "$program -Ilib myapp.psgi --workers $workers --listen $socket",

    pid_file    =&gt; $pid_file,
    stderr_file =&gt; $app_home . '/myapp.out',
    stdout_file =&gt; $app_home . '/myapp.out',

    fork        =&gt; 2,
})-&gt;run;
</code></pre>

<p>Check out Daemon::Control, it's a really helpful CPAN module that eases the creation of init scripts. Let's create the initd script.</p>

<pre><code>./myapp.starman.initd get_init_file &gt; /etc/init.d/cat-myapp
</code></pre>

<p>You want the starman processes to survive a reboot, so let's install to runlevels</p>

<pre><code>update-rc.d cat-myapp defaults
</code></pre>

<p>Now reload Nginx and start your starman processes and you should be good to go.</p>

<p>I just started using this kind of config, so any problems wouldn't surprise me too much.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>CPAN ratings</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2012/08/cpan-ratings.html" />
    <id>tag:blogs.perl.org,2012:/users/davewood//1085.3653</id>

    <published>2012-08-03T12:02:09Z</published>
    <updated>2012-08-03T19:01:31Z</updated>

    <summary>There are a couple of indicators I take into account when evaluating perl modules. Update frequency and date of last update Usually I look at the source and check for existance of test files. The next step would be to...</summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    <category term="bitcard" label="bitcard" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cpanratings" label="cpan ratings" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>There are a couple of indicators I take into account when evaluating perl modules.</p>

<ul>
<li>Update frequency and date of last update</li>
<li>Usually I look at the source and check for existance of test files.</li>
<li>The next step would be to check <a href="http://www.cpantesters.org/">cpantesters</a> results.</li>
<li>Some cpan authors are known for writing quality code</li>
<li>Also helpful sometimes are the cpan ratings.</li>
</ul>

<p>I just wanted to submit ratings for some of the modules I really like but &#8220;failed&#8221; to do so because apparently it requires a bitcard login.</p>

<p>Q: What is bitcard and why can&#8217;t I use my PAUSE login?<br />
A: <a href="http://en.wikibooks.org/wiki/Perl_Programming/CPAN/Bitcard">http://en.wikibooks.org/wiki/Perl_Programming/CPAN/Bitcard</a></p>

<p><q cite="https://www.bitcard.org/">Bitcard is an open single-sign-on web-authentication service. It&#8217;s free for both users and web sites. It is used by most perl.org services.</q></p>

<p>Ideally I would like to use one account for all perl services. If I click &#8220;login&#8221; on blogs.perl.org, cpan, &#8230; a small disclaimer that bitcard is used in the background would suffice.</p>

<p>PS: after proofreading this post I&#8217;d like to make sure no one feels offended. So don&#8217;t!</p>
]]>
        

    </content>
</entry>

<entry>
    <title>open module under cursor in vim</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2012/06/open-module-under-cursor-in-vim.html" />
    <id>tag:blogs.perl.org,2012:/users/davewood//1085.3362</id>

    <published>2012-06-10T18:31:45Z</published>
    <updated>2012-06-10T18:41:57Z</updated>

    <summary>Inspired by http://www.slideshare.net/c9s/perlhacksonvim I wrote (well ... copied for the larger part) a script to open the Module currently under the cursor in vim. Typing \fm will lookup the first Module found in available Perl library paths (plus current working...</summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    <category term="vim" label="vim" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>Inspired by http://www.slideshare.net/c9s/perlhacksonvim I wrote (well ... copied for the larger part) a script to open the Module currently under the cursor in vim.</p>

<p>Typing \fm will lookup the first Module found in available Perl library paths (plus current working directoy . '/lib')</p>

<p>I did search for some time and read a bit about <strong>ctags</strong> and <strong>pltags</strong> but ended up confused.

add this to your vimrc
<pre><code>
""""""""""""""""""""""""""""""""""""
" find module in perl INC and edit "
""""""""""""""""""""""""""""""""""""
function! GetCursorModuleName()
    let cw = substitute( expand("<cWORD>"), '.\{-}\(\(\w\+\)\(::\w\+\)*\).*$', '\1', '' )
    return cw
endfunction

function! TranslateModuleName(n)
    return substitute( a:n, '::', '/', 'g' ) . '.pm'
endfunction

function! GetPerlLibPaths()
    let out = system('perl -e ''print join "\n", @INC''')
    let paths = split( out, "\n" )
    return paths
endfunction

function! FindModuleFileInPaths()
    let paths = [ 'lib' ] + GetPerlLibPaths()
    let fname = TranslateModuleName( GetCursorModuleName() )

    for p in paths
        let f = p . '/' . fname
        if filereadable(f)
            exec "edit " . f
            return 1
        endif
    endfor

    echo "File not found: " . fname
endfunction

nmap <Leader>fm :call FindModuleFileInPaths()<CR>
</code></pre>


<h2>CAVEATS</h2><br/>
<ul>
<li>returns only the first found module
<li>"local" modules not found unless current working directory has the lib/ dir as child
</ul>]]>
        
    </content>
</entry>

<entry>
    <title>CPAN, my first time.</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/davewood/2011/12/cpan-my-first-time.html" />
    <id>tag:blogs.perl.org,2011:/users/davewood//1085.2572</id>

    <published>2011-12-13T21:18:50Z</published>
    <updated>2011-12-13T23:12:46Z</updated>

    <summary>It was not that difficult getting my first distribution released on CPAN. But getting rid of the rough edges meant spending time with my favourite search engine and on IRC. My code is hosted on github and I decided to...</summary>
    <author>
        <name>davewood</name>
        
    </author>
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/davewood/">
        <![CDATA[<p>It was not that difficult getting my first distribution released on <a href="http://www.cpan.org/">CPAN</a>. But getting rid of the rough edges meant spending time with my favourite search engine and on IRC.</p>

<p>My code is hosted on github and I decided to let <a href="http://search.cpan.org/dist/Dist-Zilla/">Dist::Zilla</a> handle most of the work associated with releasing. Oh and I already had a <a href="http://pause.perl.org">PAUSE</a> account so I could start right away.</p>

<p>Using Dist::Zilla turned out to be easy. Just install and after following the <a href="http://dzil.org/tutorial/start.html">tutorial</a> for some minutes I took my new distribution for a first spin.</p>

<p><strong>dzil test</strong><br />
to make sure everything works. (Btw. I finally got around to writing tests, something I have avoided for far too long.)<br />
<strong>dzil build</strong><br />
so I can have a look at the final result<br />
<strong>dzil release</strong><br />
publish the first development release.</p>

<p>After dzil uploaded your file to CPAN it will be automatically tested by the <a href="http://www.cpantesters.org/">CPAN Testers</a>. If any of the CPAN Testers cannot successfully build and test your module you can look up the test report to get a clue what went wrong.</p>

<p>If you think you fixed he problem increase the version and release again.</p>

<p><strong><big>Problems I encountered:</big></strong></p>

<p><strong>version numbers</strong><br />
After changing the versioning schema at least 2 times I managed to escape the perl-version-jungle and settled for the following scheme.</p>

<table>
<tr><td>0.001_001</td><td># dev release 1</td></tr>
<tr><td>0.001_002</td><td># fix bug</td></tr>
<tr><td>0.001_003</td><td># fix missing dependency</td></tr>
<tr><td>0.002000</td><td># first "stable" release</td></tr>
<tr><td>0.003_001</td><td># new feature</td></tr>
<tr><td>0.003_002</td><td># fix bug</td></tr>
<tr><td>0.004000</td><td># effectively 0.4.0</td></tr>
</table>

<p><a href="http://www.dagolden.com/index.php/369/version-numbers-should-be-boring">Details on versioning in Perl</a></p>

<p><strong>dependencies</strong><br />
I used AutoPrereqs to handle any dependencies on other CPAN modules but in the end decided to add them manually because I always had missing dependencies. (I don't want to give AutoPrereqs a bad reputation, it simply couldn't find certain modules which <a href="http://search.cpan.org/dist/Catalyst-Runtime/">Catalyst</a> automatically prefixes with the Catalyst::Plugin namespace for example.)</p>

<p>my Dist::Zilla <a href="https://github.com/davewood/catalystx-resource/blob/master/dist.ini">config</a><br />
</p>]]>
        
    </content>
</entry>

</feed>
