<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en"><title type="text">xenoterracide</title><link rel="alternate" type="text/html" href="http://www.xenoterracide.com/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/xenoterracide" /><subtitle type="html">Caleb Cushing  ( xenoterracide )'s Blog</subtitle><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-11-28T00:50:49+00:00</updated><generator uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">175</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/">5</openSearch:itemsPerPage><feedburner:info uri="xenoterracide" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><id>tag:blogger.com,1999:blog-2238114716501996649</id><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc/3.0/" /><feedburner:emailServiceId>xenoterracide</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><entry><title type="text">Adventures with SOAP using Perl: Part 1 ( SOAP::Lite )</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/xenoterracide/~3/d3BreEvNXx0/adventures-with-soap-using-perl-part-1.html" /><category term="SOAP::Lite" /><category term="SOAP" /><category term="perl" /><category term="ironman" /><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-10-28T15:03:14-07:00</updated><id>tag:blogger.com,1999:blog-2238114716501996649.post-2029660642265545306</id><content type="html">The most prevalent of SOAP libraries for Perl is&amp;nbsp;&lt;a href="https://metacpan.org/module/SOAP::Lite"&gt;SOAP::Lite&lt;/a&gt;&amp;nbsp;it is the oldest and most documented. Though for all of its documentation it can be quite painful to figure out how to use it.&lt;br /&gt;
&lt;br /&gt;
First make sure you've read&amp;nbsp;&lt;a href="http://xenoterracide.com/"&gt;Part 0&lt;/a&gt;&amp;nbsp;to set up the server. Once that's done let's look at the most simple way to interface with this server.&lt;br /&gt;
&lt;br /&gt;
In our first example we need to send a request to &lt;code&gt;getCountries&lt;/code&gt;, which is a method provided by the API. You can determine this by reading &lt;code&gt;namesservice.wsdl&lt;/code&gt; and looking for the &lt;code&gt;operation&lt;/code&gt;s to see what's available. Essentially this means we need to send SOAP request with a Body of &lt;code&gt;&amp;lt;getCountries /&amp;gt;&lt;/code&gt;. First we need to import SOAP::Lite.&lt;br /&gt;&lt;noscript&gt;https://gist.github.com/1285860&lt;/noscript&gt;
&lt;script src="https://gist.github.com/1285860.js"&gt;
&lt;/script&gt;
If you look at our SOAP::Lite import you'll notice that were are passing the arguments &lt;code&gt;+trace =&amp;gt; [ 'debug' ]&lt;/code&gt;. There are various levels and options for +trace, but this turns on full debug printing which will be sent to stderr. You don't normally want to have debug running in production code, but it will be useful to illustrate our examples and the request they send and receive.&lt;br /&gt;
&lt;br /&gt;
Now let's look at creating an actual SOAP::Lite request object.
&lt;noscript&gt;https://gist.github.com/1285987&lt;/noscript&gt;
&lt;script src="https://gist.github.com/1285987.js"&gt;
 
&lt;/script&gt;
The first option we pass in is &lt;code&gt;readable =&amp;gt; 1&lt;/code&gt;, adds whitespace to the request sent so that it's easier to read when you're looking at the debug output, you should not enable this in production, as it makes the request bigger, and I believe it is not considered correct SOAP as I've been told something about extra whitespace in SOAP being considered invalid. The second option is &lt;code&gt;proxy =&amp;gt; 'http://localhost:8877'&lt;/code&gt; This specifies the hostname and port that the HTTP request is sent to. &lt;code&gt;ns =&amp;gt; 'http://namesservice.thomas_bayer.com/'&lt;/code&gt; is the namespace, which you can find by looking for namespace in the &lt;code&gt;namesservice.wsdl&lt;/code&gt;.

&lt;br /&gt;
&lt;br /&gt;
Now we need to actually create and send an actual request.
&lt;noscript&gt;https://gist.github.com/1286050&lt;/noscript&gt;
&lt;script src="https://gist.github.com/1286050.js"&gt;
 
&lt;/script&gt; For this trivial request we simply need to call the method that we need on the remote server and then return the object. You can see that SOAP::Lite is generating a namespace for your request to use with the XML &lt;code&gt;&amp;lt;namesp1:getCountries xsi:nil="true"&amp;gt;&lt;/code&gt;, which is just fine in this case.&lt;br /&gt;
&lt;br /&gt;
Of course we want to do something with our response. Please note that I've modified the code to use 5.10, but if you want to use print instead of say this code will work fine on 5.6 and up.&lt;noscript&gt;https://gist.github.com/1286109&lt;/noscript&gt;&lt;script src="https://gist.github.com/1286109.js"&gt;
 
&lt;/script&gt; &lt;code&gt;valueof&lt;/code&gt;, which is documented in &lt;a href="https://metacpan.org/module/SOAP::SOM#ACCESSING-ELEMENT-VALUES"&gt;SOAP::SOM&lt;/a&gt;, returns the first element in scalar context, and an array in array context. So in my code I've shown both. The syntax used in the parameters to &lt;code&gt;valueof&lt;/code&gt; is &lt;a href="http://www.w3schools.com/xpath/xpath_syntax.asp"&gt;XPath&lt;/a&gt;, so an even simpler way to call it in this case would be &lt;code&gt;$res-&amp;gt;valueof(//country);&lt;/code&gt; and it would do the same thing with this XML.
&lt;br /&gt;
&lt;br /&gt;
Next let's look at the &lt;code&gt;getNameInfo&lt;/code&gt; method, it's a bit more complex so let's look at the XML in the XSD. Here's the snippet that is really important. &lt;script src="https://gist.github.com/1300052.js"&gt;
 
&lt;/script&gt;This means that we need to send a request with a body that looks like &lt;script src="https://gist.github.com/1300074.js"&gt;
 
&lt;/script&gt; &lt;em&gt;( note: you can look at the sample data in &lt;code&gt;MyExampleData.pm&lt;/code&gt; for other names. )&lt;/em&gt; Set let's take a stab at writing some Perl.&lt;script src="https://gist.github.com/1300131.js"&gt;
 
&lt;/script&gt; There are some important differences to note from our previous script. You'll notice that I call &lt;code&gt;-&amp;gt;getNameInfo()&lt;/code&gt; directly on the request object, instead of passing it as a parameter to &lt;code&gt;-&amp;gt;call&lt;/code&gt;. This functions basically the same as &lt;code&gt;call&lt;/code&gt; and it will end up making the first tag inside of body. We could have doen this in our first example as &lt;code&gt;$req-&amp;gt;getCountries;&lt;/code&gt; and that would have been it. Now that we've covered the slight differences in calls, let's go over the completely new things.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://metacpan.org/module/SOAP::Data"&gt;SOAP::Data&lt;/a&gt; objects are used to create any further data structures. Obviously the hash key of &lt;code&gt;name&lt;/code&gt; defines the element name, and &lt;code&gt;value&lt;/code&gt; defines what you want to go into it, here I have hardcoded "Mark".&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you run this code you'll notice that it returns a faultstring (among other fault properties) "operation getNameInfo for SOAP11 called with invalid data", and details the error as "element `c-gensym3' not processed at {http://namesservice.thomas_bayer.com/}getNameInfo". Now go back and look at the request, you'll see a &lt;code&gt;c-gensym3&lt;/code&gt; element, where did that come from? Well, SOAP::Lite will generate elements for anonymous elements but we can fix this. &lt;script src="https://gist.github.com/1300304.js"&gt;
 
&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
The only difference between this and the previous code is that we aren't putting a &lt;code&gt;\&lt;/code&gt; in front of &lt;code&gt;SOAP::Data&lt;/code&gt;. I wrote it the first way because I had seen examples of that all over the place, and could not find a solution to getting rid of the gensyms until I asked &lt;a href="http://stackoverflow.com/q/6986679/206466"&gt;this question on stackoverflow&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Unfortunately this is the most complex example that our server API has implemented. As an exercise to the reader I suggest Implementing a request for the method &lt;code&gt;getNamesInCountry&lt;/code&gt;, which is no more complex but available.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;--&lt;br /&gt;
This &lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type"&gt;work&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://www.xenoterracide.com" property="cc:attributionName" rel="cc:attributionURL"&gt;Caleb Cushing&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2238114716501996649-2029660642265545306?l=www.xenoterracide.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/zQqH4F0wZtfuIYPd6W7Nyo6M_ug/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zQqH4F0wZtfuIYPd6W7Nyo6M_ug/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/zQqH4F0wZtfuIYPd6W7Nyo6M_ug/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/zQqH4F0wZtfuIYPd6W7Nyo6M_ug/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenoterracide/~4/d3BreEvNXx0" height="1" width="1"/&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-28T18:03:14.661-04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.xenoterracide.com/2011/10/adventures-with-soap-using-perl-part-1.html</feedburner:origLink></entry><entry><title type="text">Adventures with SOAP using Perl: Part 0 ( prelude )</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/xenoterracide/~3/-g4MgLTkPuU/adventures-with-soap-using-perl-part-0.html" /><category term="SOAP" /><category term="Business::CyberSource" /><category term="perl" /><category term="ironman" /><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-10-15T12:00:03-07:00</updated><id>tag:blogger.com,1999:blog-2238114716501996649.post-3840467135437044163</id><content type="html">This is a prelude to a series on working with SOAP Requests using Perl.

For the past 3 months I have been working on a&amp;nbsp;&lt;a href="https://metacpan.org/module/Business::CyberSource"&gt;Perl API&lt;/a&gt;&amp;nbsp;for &lt;a href="http://www.cybersource.com/developers/develop/integration_methods/simple_order_and_soap_toolkit_api/"&gt;CyberSource's Simple Order API&lt;/a&gt; which uses SOAP (I should note, that although I believe most of the API is now stable some area's still need work, and thus I don't expect it to reach 1.0.0 anytime soon).&lt;br /&gt;
&lt;br /&gt;
First I used &lt;a href="https://metacpan.org/module/SOAP::Lite"&gt;SOAP::Lite&lt;/a&gt; to do my requests, but I found it confusing to construct the requests that I needed to make. I even discovered a bug that lead to the current ( 0.714 ) release of SOAP::Lite.&lt;br /&gt;
&lt;br /&gt;
Next I started using &lt;a href="https://metacpan.org/module/SOAP::Data::Builder"&gt;SOAP::Data::Builder&lt;/a&gt; to make it easier to build my SOAP::Lite requests. This was good, but frustrating that I had to add my data in a specific order.&lt;br /&gt;
&lt;br /&gt;
Finally I came upon&amp;nbsp;&lt;a href="https://metacpan.org/module/XML::Compile::SOAP"&gt;XML::Compile::SOAP&lt;/a&gt;. A glance at it's API which used a hash to build requests seemed much better. however, it took me a few weeks and some help from&amp;nbsp;Mark Overmeer (the author) and an update to&amp;nbsp;&lt;a href="https://metacpan.org/module/XML::Compile::SOAP::WSS"&gt;XML::Compile::SOAP::WSS&lt;/a&gt;&amp;nbsp;to get it to work.&lt;br /&gt;
&lt;br /&gt;
If you're planning on starting a new project that requires SOAP I definitely recommend using&amp;nbsp;&lt;a href="https://metacpan.org/module/XML::Compile::SOAP"&gt;XML::Compile::SOAP&lt;/a&gt;&amp;nbsp;if you have a &lt;code&gt;.wsdl&lt;/code&gt; and a &lt;code&gt;.xsd&lt;/code&gt; to work with.&lt;br /&gt;
&lt;br /&gt;
I will be covering all 3 of these methods in Parts 1, 2 and 3 of the series.&lt;br /&gt;
&lt;br /&gt;
To get started we'll need a SOAP Server since I haven't been able to find any reliable public services. To do this you can install&amp;nbsp;&lt;a href="https://metacpan.org/module/XML::Compile::SOAP::Daemon"&gt;XML::Compile::SOAP::Daemon&lt;/a&gt;&amp;nbsp;(which probably could use some Plack/PSGI love ). You'll also want to&lt;a href="http://cpan.metacpan.org/authors/id/M/MA/MARKOV/XML-Compile-SOAP-Daemon-3.00.tar.gz"&gt; download it's tarball directly&lt;/a&gt;, extract it and &lt;code&gt;cd examples/namesservice&lt;/code&gt;. Once you've done that you can do &lt;code&gt;perl server.pl&lt;/code&gt; . Now you should have a Server running on&amp;nbsp;&lt;a href="http://localhost:8877/"&gt;http://localhost:8877&lt;/a&gt;&amp;nbsp;which we can use for testing our client examples.&lt;br /&gt;
&lt;br /&gt;
Please be advised, these tutorials will not be explain XML, XSD, WSDL, or SOAP, but simply the Perl interfaces.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;--&lt;br /&gt;
This &lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type"&gt;work&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://www.xenoterracide.com" property="cc:attributionName" rel="cc:attributionURL"&gt;Caleb Cushing&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2238114716501996649-3840467135437044163?l=www.xenoterracide.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/R1C6-LhJ4j1AnZCkkL06Y585lAc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R1C6-LhJ4j1AnZCkkL06Y585lAc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/R1C6-LhJ4j1AnZCkkL06Y585lAc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/R1C6-LhJ4j1AnZCkkL06Y585lAc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenoterracide/~4/-g4MgLTkPuU" height="1" width="1"/&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2011-10-15T15:00:03.136-04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://www.xenoterracide.com/2011/10/adventures-with-soap-using-perl-part-0.html</feedburner:origLink></entry><entry><title type="text">Experience with having a non Dist::Zilla user contribute to a Dist::Zilla project (it's not hard for them or me)</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/xenoterracide/~3/wjRYX7HGVZ4/experience-with-having-non-distzilla.html" /><category term="git" /><category term="Dist::Zilla" /><category term="perl" /><category term="ironman" /><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-07-04T23:07:21-07:00</updated><id>tag:blogger.com,1999:blog-2238114716501996649.post-165790741114989107</id><content type="html">I've heard many times that &lt;a href="http://dzil.org"&gt;Dist::Zilla&lt;/a&gt; makes it harder for people to contribute to the project. This is not true, it is either unfortunately either ignorance or FUD (much like saying Linux is harder to use than Windows). Truly, there are things that some dzil users do that &lt;i&gt;can&lt;/i&gt; make it harder, but it doesn't have to be that way. &lt;a href="https://github.com/xenoterracide/Test-Version/pull/1"&gt;Michael Schwern recently contributed to one of my dzil projects without ever realizing I was using dzil, until I told him&lt;/a&gt;. He more recently stated on twitter, "While your solution works, it seems like it makes more work for you to shield contributors from dzil". This was true in this case because I wasn't sure how to effectively move a series of multiple patches, I now know it's easy to do with git. Here's how you can allow contributors to contribute to your dzil project without causing you or them undo pain.&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;&lt;li&gt;&lt;dl&gt;&lt;dt&gt;Don't use anything that changes the line numbers of your source&lt;/dt&gt;
&lt;dd&gt;Examples: don't use &lt;a href="http://search.cpan.org/dist/Dist-Zilla-Plugin-Prepender/lib/Dist/Zilla/Plugin/Prepender.pm"&gt;DZP::Prepender&lt;/a&gt;. Use modules like &lt;a href="http://search.cpan.org/dist/Dist-Zilla-Plugin-OurPkgVersion/lib/Dist/Zilla/Plugin/OurPkgVersion.pm"&gt;OurPkgVersion&lt;/a&gt; to insert VERSION, and make sure your # ABSTRACT and any pod is below the &lt;code&gt;1;&lt;/code&gt; at the end of your module. This will keep the line numbers of errors in your code from being different from the final build. It's still ok to use PodWeaver as it will save you way more time than it'll hurt, so long as you follow the rules about pod being at the bottom&lt;/dd&gt; &lt;/dl&gt;&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;dl&gt;&lt;dt&gt;Use a plugin that commits builds to your source control software&lt;/dt&gt;
&lt;dd&gt; I personally recommend &lt;a href="http://search.cpan.org/dist/Dist-Zilla-Plugin-Git/lib/Dist/Zilla/Plugin/Git/CommitBuild.pm"&gt;DZP::Git::CommitBuild&lt;/a&gt;  &lt;/dd&gt; &lt;/dl&gt;&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;li&gt;&lt;dl&gt;&lt;dt&gt;Make your build branch your default branch&lt;/dt&gt;
&lt;dd&gt;I'm not sure how to do this with just git, but on github you can go to the admin section of your repository and change the default branch there. This makes it so that when someone clone's your repository the initial checkout is of your build branch. Your build branch shouldn't require dzil, it's the final build.&lt;/dd&gt; &lt;/dl&gt;&lt;/li&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;/ol&gt;&lt;br /&gt;
Now that you have your final build branch as the default branch anyone who wants to contribute can simply clone your repo and start hacking. Their are a couple of mistakes they could make, They could either change or add files that are maintained, or pruned by dzil. This did happen when Schwern sent me patches, one of them was the addition of a .gitignore, which I already had, but is being pruned out of the build branch. I can also see it happening to meta's and makefiles. These patches can simply be rejected as unnecessary, dzil-ified, or if they are truly a bug, then they can be reported and fixed upstream.&lt;br /&gt;
&lt;br /&gt;
So what if someone sends you a pull request from &lt;code&gt;build/master&lt;/code&gt;? well if it's just one or two patches, you add their remote, and do a &lt;code&gt;git remote update&lt;/code&gt; and then you can &lt;code&gt;git log remote build/master&lt;/code&gt; to find the sha1 of this patch. Now that you have the sha1 all you have to do is &lt;code&gt;git cherry-pick [sha1]&lt;/code&gt; and it should apply. If there are any conflicts you may have to resolve them with &lt;code&gt;git mergetool&lt;/code&gt;. However, the only conflict with Schwern's patches for me was the .gitignore, all other patches applied without assistance and applied correcly, surprisingly even the pod patch applied without issue.&lt;br /&gt;
&lt;br /&gt;
If you have more patches than is comfortable with &lt;code&gt;git cherry-pick&lt;/code&gt; then you need &lt;code&gt;git rebase&lt;/code&gt;. The command you want is &lt;code&gt;git rebase -i --onto master [sha1 before first sha1 in series] [tip of remote branch checkout]&lt;/code&gt;. So in my case &lt;code&gt;git rebase -i --onto master 3f1e3748 schwern&lt;/code&gt;. What this appears to do is ends up rewriting my local schwern/build/master checkout and removes all the build commits, and then applies the patches on top. This means I can now do &lt;code&gt;git merge schwern&lt;/code&gt; from the master branch, and all of his patches that I want will be successfully merged. For more on this strategy you may want to read &lt;a href="http://stackoverflow.com/questions/1994463/how-to-cherry-pick-a-range-of-commits-and-merge-into-another-branch"&gt;this stackoverflow question&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
given this is not quite as easy as a &lt;code&gt;git pull&lt;/code&gt; that's a fast forward, but reality is it's not that hard once you know how to do the rebase and how it works. Of course this isn't ideal for constant contributors, those should simply learn to use dzil, but for the random contributor it should be ok.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;--&lt;br /&gt;
This &lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type"&gt;work&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://www.xenoterracide.com" property="cc:attributionName" rel="cc:attributionURL"&gt;Caleb Cushing&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2238114716501996649-165790741114989107?l=www.xenoterracide.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/1DrtKg1IdKA2KOM5yIGtAXxB4xs/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1DrtKg1IdKA2KOM5yIGtAXxB4xs/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/1DrtKg1IdKA2KOM5yIGtAXxB4xs/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/1DrtKg1IdKA2KOM5yIGtAXxB4xs/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenoterracide/~4/wjRYX7HGVZ4" height="1" width="1"/&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2011-07-05T02:07:21.690-04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://www.xenoterracide.com/2011/07/experience-with-having-non-distzilla.html</feedburner:origLink></entry><entry><title type="text">My solution to not using PluginBundle:AUTHOR for dzil is git</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/xenoterracide/~3/DS1n3TElulI/my-solution-to-not-using.html" /><category term="git" /><category term="Dist::Zilla" /><category term="ironman" /><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-06-05T12:47:38-07:00</updated><id>tag:blogger.com,1999:blog-2238114716501996649.post-2899700312098468685</id><content type="html">I am now tired of updating my &lt;code&gt;dist.ini&lt;/code&gt;'s for my &lt;a href="http://dzil.org"&gt;Dist::Zilla&lt;/a&gt; projects. For many people this is when they start using a PluginBundle with their authorname. I &lt;a href="http://www.xenoterracide.com/2010/06/please-dont-use-distzillapluginbundleus.html"&gt;discussed why you shouldn't do this a year ago&lt;/a&gt;. Now that I'm tired of managing my dist.ini's on an individual basis I'm going to show you how I'm going to solve the same problem everyone else is, which is getting tired of updating your dzil configuration for all of your projects. I'm using git to do it. You probably haven't considered this, or am thinking I'm wrong because you believe that git can't merge branches without a common history, which is not true. I did it with Regen2, Funtoo, Portage, and Sunrise, which have way more files than any perl repo, including Perl.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First let's talk about the advantages and disadvantages of doing this with git.&lt;br /&gt;
&lt;br /&gt;
I'll start with the disadvantages. You'll have another repository to manage. Git isn't completely automatic, you'll have to remember to merge your changes. You'll also have to add the repository to your existing repositories. You will have to resolve merge conflicts at least once, and probably occasionally more, though most should be fast-forwards.&lt;br /&gt;
&lt;br /&gt;
The advantages are... now the changes to your dist.ini are getting recorded in your history. You can now have a master dist.ini, but remove items without filters in your individual modules. You can share even more configuration as merged differences allow you to maintain differences in downstream commits. It doesn't automatically update all of your modules. Wait didn't I list that last one in disadvantages? Yep, it's an advantage because what if you update your PluginBundle and that update breaks one of your modules, but you don't know it because you haven't worked on that module in a while. You can use this for more than just dist.ini.&lt;br /&gt;
&lt;br /&gt;
Ok so the first thing you you want to do is create your master dzil repo. This is not a &lt;a href="http://git-scm.com/documentation"&gt;git&lt;/a&gt; or &lt;a href="http://dzil.org/"&gt;dzil&lt;/a&gt; tutorial so go do that. I did it by creating a &lt;code&gt;dzil new project&lt;/code&gt; and removing the files I couldn't use and making a few tweaks and amending all of those changes to the initial commit. Check out &lt;a href="https://github.com/xenoterracide/dzil-base"&gt;my repo&lt;/a&gt; for inspiration. Remember the directory structure has to be the same as a dzil repo structure for any common files.&lt;br /&gt;
&lt;br /&gt;
Now add a remote from your new repo to an existing dzil project. Next you need to merge the branch from the remote into your project. The first time you do this you'll have to resolve conflicts. If they're like &lt;a href="https://github.com/xenoterracide/Test-Version/commit/89ea6813da279ff74f87b0628db492fc1451e526"&gt;mine&lt;/a&gt; then they'll be easy and obvious. Once that's done future changes will be fast-forwards unless you change something in your perl module repo, then you might end up with a simple merge conflict. One thing to remember NEVER EVER try to merge from your module repo to your dzil repo, it will cause you extreme pain in the future. cherry-picking that direction is possible but not merging.&lt;br /&gt;
&lt;br /&gt;
After that, all that is left to do is run your dzil tests and fix any breakage in your module. Happy merging.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;--&lt;br /&gt;
This &lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type"&gt;work&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://www.xenoterracide.com" property="cc:attributionName" rel="cc:attributionURL"&gt;Caleb Cushing&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2238114716501996649-2899700312098468685?l=www.xenoterracide.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ZK3I9kWG34kU97dDZvDNSiQSwyQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZK3I9kWG34kU97dDZvDNSiQSwyQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ZK3I9kWG34kU97dDZvDNSiQSwyQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ZK3I9kWG34kU97dDZvDNSiQSwyQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenoterracide/~4/DS1n3TElulI" height="1" width="1"/&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-05T15:47:38.427-04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.xenoterracide.com/2011/06/my-solution-to-not-using.html</feedburner:origLink></entry><entry><title type="text">Regen2 accounts transferred</title><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/xenoterracide/~3/3aOcSVSnhSE/regen2-accounts-transfered.html" /><category term="Regen2" /><author><name>xenoterracide</name><email>noreply@blogger.com</email><uri>http://www.blogger.com/profile/08185254298048097278</uri></author><updated>2011-06-05T09:57:17-07:00</updated><id>tag:blogger.com,1999:blog-2238114716501996649.post-6392425171357125738</id><content type="html">&lt;a href="http://www.xenoterracide.com/2009/05/regen2-dont-care-anymore.html"&gt;I killed regen2 about 2 years ago&lt;/a&gt;. Today I was contacted by Rafal Kupiec asking about the project. Since it's dead he asked if he could take over the project. I have transfered the github account, and freenode channel #regen2 to him. The google groups are remaining archived. At some point in the future there should be a site at &lt;a href="http://www.asiotec.org/"&gt;asiotec.org&lt;/a&gt; I have no idea what he plans on doing with it.&lt;div class="blogger-post-footer"&gt;&lt;br /&gt;--&lt;br /&gt;
This &lt;span xmlns:dc="http://purl.org/dc/elements/1.1/" href="http://purl.org/dc/dcmitype/Text" rel="dc:type"&gt;work&lt;/span&gt; by &lt;a xmlns:cc="http://creativecommons.org/ns#" href="http://www.xenoterracide.com" property="cc:attributionName" rel="cc:attributionURL"&gt;Caleb Cushing&lt;/a&gt; is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/3.0/"&gt;Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License&lt;/a&gt;.&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2238114716501996649-6392425171357125738?l=www.xenoterracide.com' alt='' /&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/OvgtC3cls0GuwO4aGOfdjMRC4MQ/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OvgtC3cls0GuwO4aGOfdjMRC4MQ/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/OvgtC3cls0GuwO4aGOfdjMRC4MQ/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/OvgtC3cls0GuwO4aGOfdjMRC4MQ/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenoterracide/~4/3aOcSVSnhSE" height="1" width="1"/&gt;</content><app:edited xmlns:app="http://www.w3.org/2007/app">2011-06-05T12:57:17.734-04:00</app:edited><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://www.xenoterracide.com/2011/06/regen2-accounts-transfered.html</feedburner:origLink></entry></feed>

