<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>$mjgardner-&gt;()</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/" />
    <link rel="self" type="application/atom+xml" href="http://blogs.perl.org/users/mark_gardner/atom.xml" />
    <id>tag:blogs.perl.org,2009-11-03:/users/mark_gardner//745</id>
    <updated>2012-03-19T18:01:52Z</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>MooseX::App::Cmd</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2012/03/moosexappcmd.html" />
    <id>tag:blogs.perl.org,2012:/users/mark_gardner//745.2958</id>

    <published>2012-03-19T17:49:18Z</published>
    <updated>2012-03-19T18:01:52Z</updated>

    <summary>I&apos;m finally taking advantage of the co-maintainer bit that Yuval Kogman gave me last year and putting out new releases of MooseX::App::Cmd....</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="distzilla" label="Dist::Zilla" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moose" label="Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moosexappcmd" label="MooseX::App::Cmd" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mouse" label="Mouse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mousexappcmd" label="MouseX::App::Cmd" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>I'm finally taking advantage of the co-maintainer bit that <a href="https://metacpan.org/author/NUFFIN">Yuval Kogman</a> gave me last year and putting out new releases of <a href="https://metacpan.org/release/MooseX-App-Cmd">MooseX::App::Cmd</a>.</p>]]>
        <![CDATA[<p>The <a href="https://metacpan.org/release/MJGARDNER/MooseX-App-Cmd-0.09">latest release</a> fixes a number of long-standing bugs as well as a more recent test bug that cropped up as a result of recent changes in its dependencies. I also bit the bullet and converted to <a href="http://dzil.org/">Dist::Zilla</a>; hopefully that won't piss off any of the other maintainers.</p>

<p>Eventually I'd like to merge MooseX::App::Cmd with its <a href="https://metacpan.org/module/MouseX::App::Cmd">Mouse counterpart</a>, but that will require a bit more thought and planning.</p>]]>
    </content>
</entry>

<entry>
    <title>Mentor as anything</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/11/mentor-as-anything.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2474</id>

    <published>2011-11-21T13:27:24Z</published>
    <updated>2011-11-21T13:31:24Z</updated>

    <summary>The Google Code-in 2011 is open and I&apos;m one of the mentors for The Perl Foundation&apos;s projects. If you are or know a 13- to 17-year-old budding open source developer, check out the site and start knocking down tasks!...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
    <category term="gci" label="gci" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="gci2011" label="gci2011" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="google" label="google" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="tpf" label="tpf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>The Google Code-in 2011 is open and I'm one of the mentors for <a href="http://www.google-melange.com/gci/org/google/gci2011/tpf">The Perl Foundation's projects</a>. If you are or know a 13- to 17-year-old budding open source developer, <a href="http://www.google-melange.com/gci/homepage/google/gci2011">check out the site</a> and start knocking down tasks!</p>]]>
        
    </content>
</entry>

<entry>
    <title>I  XML::Rabbit</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/09/i-xmlrabbit.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2212</id>

    <published>2011-09-20T18:49:35Z</published>
    <updated>2011-09-20T18:57:00Z</updated>

    <summary>Just a quick note about how much I appreciate the work Robin Smidsrød has done on XML::Rabbit. I&apos;m now using it on a second project, and the ease in which I can quickly build a set of classes and attributes...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ant" label="Ant" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moose" label="Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xml" label="XML" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xmlantbuildfile" label="XML::Ant::BuildFile" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xmlrabbit" label="XML::Rabbit" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>Just a quick note about how much I appreciate the work <a href="http://robin.smidsrod.no/">Robin Smidsrød</a> has done on <a href="http://metacpan.org/release/XML-Rabbit">XML::Rabbit</a>. I'm now using it on a second project, and the ease in which I can quickly build a set of classes and attributes to process XML documents combined with the usual <a href="http://moose.perl.org/">Moose</a>-y goodness is truly wonderful.</p>

<p>The first project in which I used XML::Rabbit, <a href="http://metacpan.org/release/XML-Ant-BuildFile">XML::Ant::BuildFile</a>, is still chugging away and working well.</p>]]>
        
    </content>
</entry>

<entry>
    <title>I&apos;m making a note here: HUGE SUCCESS</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/09/im-making-a-note-here-huge-success.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2187</id>

    <published>2011-09-13T14:39:49Z</published>
    <updated>2011-09-13T15:26:28Z</updated>

    <summary>Thanks to the Philadelphia Perl Mongers for hosting my DB Critic talk last night. I got over my public-speaking jitters and it went really well, with great questions and ideas from the whole group....</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dbcritic" label="DB Critic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbixclassschemacritic" label="DBIx::Class::Schema::Critic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moose" label="Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mouse" label="Mouse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="oo" label="OO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="phlpm" label="phl.pm" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>Thanks to the <a href="http://phl.pm.org/">Philadelphia Perl Mongers</a> for hosting my <a href="http://mjgardner.github.com/DBIx-Class-Schema-Critic/doc/presentation/index.html">DB Critic talk</a> last night. I got over my public-speaking jitters and it went really well, with great questions and ideas from the whole group.</p>]]>
        <![CDATA[<p>Chris Nehren (<a href="https://metacpan.org/author/APEIRON">apeiron</a>) noted in a followup email that a <a href="http://perl5.git.perl.org/perl.git/blob_plain/HEAD:/pod/perlootut.pod">new perlootut</a> (Object-Oriented Programming in Perl Tutorial) document by <a href="http://blog.urth.org/">Dave Rolsky</a> is in bleadperl. It's worth reading if your eyes glaze over at OO concepts like classes, inheritance, attributes and roles; or OO systems like <a href="http://moose.perl.org/">Moose</a> or <a href="https://metacpan.org/module/Mouse">Mouse</a>.</p>]]>
    </content>
</entry>

<entry>
    <title>Presenting DB Critic at Philadelphia Perl Mongers tomorrow night</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/09/presenting-db-critic-at-philadelphia-perl-mongers-tomorrow-night.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2183</id>

    <published>2011-09-12T01:10:24Z</published>
    <updated>2011-09-12T18:50:26Z</updated>

    <summary><![CDATA[Just a quick FYI that I'll be presenting DB Critic (n&eacute;e DBIx::Class::Schema::Critic) tomorrow night at the monthly Philadelphia Perl Mongers meeting. We're in Room 307 of Levine Hall on the University of Pennsylvania starting at 7:00 PM....]]></summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="meta" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="dbcritic" label="DB Critic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbixclassschemacritic" label="DBIx::Class::Schema::Critic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="phlpm" label="phl.pm" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>Just a quick FYI that I'll be presenting <a href="http://mjgardner.github.com/DBIx-Class-Schema-Critic/">DB Critic</a> (<em>n&eacute;e</em> DBIx::Class::Schema::Critic) tomorrow night at the monthly <a href="http://philadelphia.pm.org/">Philadelphia Perl Mongers</a> meeting. We're in Room 307 of Levine Hall on the University of Pennsylvania starting at 7:00 PM.<br />
</p>]]>
        <![CDATA[<p>I've <a href="http://mjgardner.github.com/DBIx-Class-Schema-Critic/doc/presentation/index.html">posted the slides online</a> for anyone who's interested. And yes, this was that thing I <a href="http://blogs.perl.org/users/mark_gardner/2011/08/dbixclassschemacritic-and-parameterized-roles.html">blogged about</a> last month.</p>]]>
    </content>
</entry>

<entry>
    <title>The life and death (well, deprecation) of a wrapper module</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/08/the-life-and-death-well-deprecation-of-a-wrapper-module.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2129</id>

    <published>2011-08-24T02:21:52Z</published>
    <updated>2011-08-24T02:58:05Z</updated>

    <summary>Earlier this year I was frustrated with Salvador Fandiño García&apos;s otherwise excellent Net::SFTP::Foreign package. It was in almost all respects the best choice for my current project at work, but the then-current version required me to check the return values...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="anymoose" label="Any::Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="exceptions" label="exceptions" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moose" label="Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="mouse" label="Mouse" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="netftpforeignexceptional" label="Net::FTP::Foreign::Exceptional" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="netsftpforeign" label="Net::SFTP::Foreign" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="packagedeprecationmanager" label="Package::DeprecationManager" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="sftp" label="SFTP" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="ssh" label="SSH" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="trytiny" label="Try::Tiny" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>Earlier this year I was frustrated with Salvador Fandiño García's otherwise excellent <a href="https://metacpan.org/module/Net::SFTP::Foreign">Net::SFTP::Foreign</a> package. It was in almost all respects the best choice for my current project at work, but the <a href="https://metacpan.org/module/SALVA/Net-SFTP-Foreign-1.64/lib/Net/SFTP/Foreign.pm">then-current version</a> required me to check the return values of method calls for success or failure, and then use an <tt>error</tt> method to get any reasons for failure that might be waiting. The rest of my code used exceptions courtesy of <a href="https://metacpan.org/module/Try::Tiny">Try::Tiny</a>, and having to write three lines of boilerplate code for every SFTP call was getting annoying.</p>

<p>Thus was born <a href="https://metacpan.org/module/Net::SFTP::Foreign::Exceptional">Net::SFTP::Foreign::Exceptional</a>, a very thin wrapper around Net::SFTP::Foreign that proxied all public method calls and then used a <a href="https://metacpan.org/module/Moose">Moose</a> <tt>after</tt> method modifier to throw an exception on any errors. (It <a href="https://metacpan.org/module/MJGARDNER/Net-SFTP-Foreign-Exceptional-0.002/lib/Net/SFTP/Foreign/Exceptional.pm">originally</a> used subclassing instead, but Salva set me straight on that and the less said about it the better.)</p>

<p>All was right with the world, or at least my project. I tweaked my wrapper a little bit, including switching to <a href="https://metacpan.org/module/Any::Moose">Any::Moose</a> for situations in which Moose was just too heavy. In July, though, Salva released a new version of Net::SFTP::Foreign that <a href="https://metacpan.org/module/Net::SFTP::Foreign#Error-handling">threw exceptions on its own</a> with the addition of a new <tt>autodie</tt> constructor parameter. Which is cool in that I can use one less level of abstraction in my code, but bad in that it would take a while to fix my projects to not use the ::Exceptional wrapper. And even though mine was just a pipsqueak of a module that hadn't been out for very long, it would be bad form to immediately delete it from CPAN.</p>

<p>Enter Dave Rolsky's <a href="https://metacpan.org/module/Package::DeprecationManager">Package::DeprecationManager</a>, which provides a nice interface for marking certain method calls as "deprecated" by issuing a warning when they're called. In ::Exceptional's case, I wanted to change the code to use Net::SFTP::Foreign's new <tt>autodie</tt> parameter, but also warn that users should switch to doing that themselves instead of using ::Exceptional. So I marked <tt>new</tt> as deprecated, added the appropriate tests and docs, and released.</p>

<p>Total lifetime of Net::SFTP::Foreign::Exceptional: two months. But it got the job done, I learned how to (and how not to) write a wrapper module and how to manage deprecations when it's time to plan for a method's retirement. All in all time well spent.</p>]]>
        
    </content>
</entry>

<entry>
    <title>My first module: Data::Compare::Plugins::Set::Object</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/08/my-first-module-datacomparepluginssetobject.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2073</id>

    <published>2011-08-09T21:30:37Z</published>
    <updated>2011-08-09T22:04:50Z</updated>

    <summary>I wrote Data::Compare::Plugins::Set::Object (blech, what a mouthful) a couple months into my job at GSI. At the time I wasn&apos;t sure what if any their policy was on open source releases, so I was careful to do it on the...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cpan" label="CPAN" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="datacompare" label="Data::Compare" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="datacomparepluginssetobject" label="Data::Compare::Plugins::Set::Object" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="distzilla" label="Dist::Zilla" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moduleinstall" label="Module::Install" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="plugins" label="plugins" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="setobject" label="Set::Object" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="weblogic" label="WebLogic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="xml" label="XML" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>I wrote <a href="https://metacpan.org/release/Data-Compare-Plugins-Set-Object">Data::Compare::Plugins::Set::Object</a> (blech, what a mouthful) a couple months into my job at <a href="http://www.gsicommerce.com/">GSI</a>. At the time I wasn't sure what if any their policy was on open source releases, so I was careful to do it on the side and assign copyright to myself. I still haven't found an explicit policy beyond my manager's "just use your best judgment" statement. Maybe that's for the best.</p>

<p>It's a tiny tiny little module (less than 40 lines of code) that does a tiny tiny little thing (compare deep data structures while doing correct comparisons for unordered sets). Its main significance to me was that it exposed me to all the necessary but not difficult work of packaging up a distribution for CPAN, including documentation, tests, metadata and an installer. I went with <a href="https://metacpan.org/release/Module-Install">Module::Install</a> for the latter since it seemed like it took care of most of the repetitive work. These days I favor <a href="http://dzil.org/">Dist::Zilla</a> -- like the tagline says, it's maximum overkill and through its plugin system can automate just about anything a Perl developer needs to do. I've even written a few plugins.</p>

<p>Oh, and why did I write DCPSO? I was working on a tool to compare <a href="http://www.oracle.com/us/products/middleware/application-server/index.html">WebLogic</a> configuration files, which are just big bags of XML with a lot of settings in no particular order. Plain old diff is no good, and even the XML-savvy variants out there (correctly) insist that element order is significant. So my program slurped in the XML and converted it to a hierarchy of hashes, lists and (you guessed it) unordered sets, reporting how and where one server was truly configured differently from another so I could fix them to be more alike.</p>

<p>A pretty specialized task, but I figured that the set comparison bits could be used elsewhere so I released them. And if not, hey, it got me into CPAN authoring.</p>]]>
        
    </content>
</entry>

<entry>
    <title>DBIx::Class::Schema::Critic and parameterized roles</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/08/dbixclassschemacritic-and-parameterized-roles.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2070</id>

    <published>2011-08-09T17:15:01Z</published>
    <updated>2011-08-09T22:09:42Z</updated>

    <summary>I originally started DBIx::Class::Schema::Critic as a code sample for a job application, but I thought it was worth releasing and continued independent development. Inspired by Perl::Critic, it&apos;s a package for comparing relational database schemas against a collection of best practice...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="projects" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="databases" label="databases" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbixclass" label="DBIx::Class" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="dbixclassschemacritic" label="DBIx::Class::Schema::Critic" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moo" label="Moo" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moose" label="Moose" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="moosexroleparameterized" label="MooseX::Role::Parameterized" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="oo" label="OO" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="roles" label="roles" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>I originally started <a href="https://metacpan.org/release/DBIx-Class-Schema-Critic">DBIx::Class::Schema::Critic</a> as a code sample for a job application, but I thought it was worth releasing and continued independent development. Inspired by <a href="http://perlcritic.com/">Perl::Critic</a>, it's a package for comparing relational database schemas against a collection of best practice policies using the <a href="http://www.dbix-class.org/">DBIx::Class</a> Object/Relational Mapper.</p>

<p>At <a href="http://www.shadowcat.co.uk/blog/matt-s-trout/">mst</a>'s behest I converted it from the <a href="https://metacpan.org/release/Moose">Moose</a> object system to his more lightweight <a href="https://metacpan.org/release/Moo">Moo</a>. But now that I've accumulated a few policy modules I'd like to refactor their commonalities out into <a href="https://metacpan.org/module/Moo::Role">roles</a>.</p>

<p>Trouble is that Moo doesn't have an equivalent to Moose's <a href="https://metacpan.org/release/MooseX-Role-Parameterized">MooseX::Role::Parameterized</a>, and I can definitely see use for that in creating a bunch of similar roles for each DBIx::Class object a policy <a href="https://metacpan.org/module/DBIx::Class::Schema::Critic::Policy#applies_to">applies to</a>.</p>

<p>So what to do? Can/should I port parameterized roles to Moo, while avoiding the overhead of a meta-object protocol like Moose's <a href="https://metacpan.org/module/Class::MOP">Class::MOP</a> (which Moo explicitly rejects)? Or just make a bunch of more-or-less identical roles that differ only in name and attribute content, accepting the repetition as the price of minimalism?</p>]]>
        
    </content>
</entry>

<entry>
    <title>About me</title>
    <link rel="alternate" type="text/html" href="http://blogs.perl.org/users/mark_gardner/2011/08/about.html" />
    <id>tag:blogs.perl.org,2011:/users/mark_gardner//745.2069</id>

    <published>2011-08-09T17:00:00Z</published>
    <updated>2011-08-09T17:42:35Z</updated>

    <summary>I&apos;m a developer currently working as a build automation engineer for an e-commerce services company. I&apos;ve been working with Perl since 1994, and although I started focused on web applications I&apos;ve gradually moved into toolsmithing and custom applications. My PAUSE/CPAN...</summary>
    <author>
        <name>Mark Gardner</name>
        <uri>http://www.phoenixtrap.com</uri>
    </author>
    
        <category term="meta" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://blogs.perl.org/users/mark_gardner/">
        <![CDATA[<p>I'm a developer currently working as a build automation engineer for an e-commerce services company. I've been working with Perl since 1994, and although I started focused on web applications I've gradually moved into toolsmithing and custom applications.</p>

<p>My PAUSE/CPAN ID is <a href="https://metacpan.org/author/MJGARDNER">MJGARDNER</a>, and I usually host <a href="https://github.com/mjgardner">my public development efforts on GitHub</a>.</p>]]>
        
    </content>
</entry>

</feed>
