<div dir="ltr">I've abstracted out my work to something more general. I'm going to copy over and run the entire DBIC test suite against it and see what fails. There is some magic in the load_components bit as it uses some Moo internals to do the Moo extends and with properly. Just posting here if anyone is curious.<div><br></div><div><a href="https://github.com/bluefeet/DBICx-Moo">https://github.com/bluefeet/DBICx-Moo</a><br></div><div><br></div><div>Aran</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Oct 1, 2014 at 7:21 PM, Aran Deltac <span dir="ltr"><<a href="mailto:bluefeet@gmail.com" target="_blank">bluefeet@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><span class=""><span style="font-family:arial,sans-serif;font-size:13px">I've been converting a lot of @work's custom components, result, result set, schema, and storage classes (yes, we even have custom storage classes) to Moo roles and classes.</span><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">I've just about completed it and have worked through a lot of issues, but am left with one remaining issue which I'm stumped at and have been able to whittle it down to a couple small examples:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><div>package FooResult;</div><div>use Moo;</div><div>print 'HAS BUILDARGS: ' . (FooResult->can('BUILDARGS') ? 'YES' : 'NO') . "\n";</div><div>extends 'DBIx::Class::Core';</div><div>print 'HAS BUILDARGS: ' . (FooResult->can('BUILDARGS') ? 'YES' : 'NO') . "\n";</div></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">That prints:</div><div style="font-family:arial,sans-serif;font-size:13px"><div>HAS BUILDARGS: YES</div><div>HAS BUILDARGS: NO</div></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div></span><div style="font-family:arial,sans-serif;font-size:13px">I was able to change this to YES-YES by adding Moo::Object to the front of my extends, which in the above example would look like:</div><span class=""><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">extends 'Moo::Object', 'DBIx::Class::Core';</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Is that the right thing to do when inheriting from a non-Moo class? Documentation on non-moo inheritance was minimal in the Moo docs, but maybe I missed it. Note that I found this issue via a Moose result class which inherits from my Moo result base class which inherits from DBIx::Class::Core. Something about that relationship structure requires BUILDARGS even though the involved code neither declares nor calls BUILDARGS.</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Another issue is this:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">package FooResult;</div><div style="font-family:arial,sans-serif;font-size:13px">use Moo;</div><div style="font-family:arial,sans-serif;font-size:13px">extends 'DBIx::Class::Core';</div><div style="font-family:arial,sans-serif;font-size:13px">has bar => ( is=>'ro' );</div><div style="font-family:arial,sans-serif;font-size:13px">FooResult->new( bar=>32 );</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Which then hangs with:</div><div style="font-family:arial,sans-serif;font-size:13px"><div><br></div><div>Deep recursion on subroutine "DBIx::Class::Row::throw_exception" at /home/aran/local-lib/lib/perl5/DBIx/Class/Row.pm line 1416.</div><div>Deep recursion on subroutine "DBIx::Class::Row::result_source" at /home/aran/local-lib/lib/perl5/DBIx/Class/Row.pm line 1568.</div></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">I tried fiddling with FOREIGNBUILDARGS to see if I could produce arguments which made DBIC's new() happy but it was a fruitless effort.</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div></span><div style="font-family:arial,sans-serif;font-size:13px">At this point the error I am getting with the real application code is:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px"><div>DBIx::Class::Sims::load_sims(): Can't call method "new" on an undefined value at /home/aran/local-lib/lib/perl5/DBIx/Class/ResultSet.pm line 2590. at /home/aran/ziprecruiter/app/t/lib/Test/ZR/Schema.pm line 95<br></div><div><br></div><div>Which is what lead me to the two previous examples. As far as I can tell my Moo conversion is complete and there is something wrong with the argument processing between Moo and DBIC.</div></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">I'm using the latest DBIC (0.082800) and Moo (1.006).</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Any pointers, examples, words of wisdom, RTFMs, etc, appreciated.<br></div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Thanks!</div></div>
</blockquote></div><br></div>