<br><br><div><span class="gmail_quote">On 8/8/06, <b class="gmail_sendername">Nathan Kurz</b> &lt;<a href="mailto:nate@verse.com">nate@verse.com</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
On Tue, Aug 08, 2006 at 11:53:09AM +0100, Matt S Trout wrote:<br>&gt; Nathan Kurz wrote:<br>&gt; &gt; I was just changing some things with my DBIx::Class schema's, and ran<br>&gt; &gt; into some problems that stumped me for a bit.&nbsp;&nbsp;I had been calling
<br>&gt; &gt; $c-&gt;model() and having it choose the correct model, but after I<br>&gt; &gt; rearranged the items in MyApp::Model::* things stopped working.<br>&gt; &gt;<br>&gt; &gt; I put in a debug statement like this:
<br>&gt; &gt;&nbsp;&nbsp; sub test : Local {<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; my ($self, $c) = @_;<br>&gt; &gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $c-&gt;log-&gt;dumper('ref $c-&gt;model: ' . ref $c-&gt;model);<br>&gt; &gt;&nbsp;&nbsp; }<br>&gt; &gt; And to my surprise found that $c-&gt;model made no sense at all:
<br>&gt; &gt;&nbsp;&nbsp; [debug] $VAR1 = 'ref $c-&gt;model: DBIx::Class::ResultSet';<br>&gt;<br>&gt; That makes perfect sense - it'll be finding the first<br>&gt; MyApp::Model::* in hash key order; if that happens to be a<br>&gt; DBIC::Schema sub-model (
i.e.&nbsp;&nbsp;Model::DBIC::Foo) you'll get back a<br>&gt; resultset as $c-&gt;model(&quot;DBIC::Foo&quot;) would return.<br><br>Thanks for your quick reponse, Matt!<br><br>Perhaps I mispoke when I said &quot;made no sense&quot;.&nbsp;&nbsp;I was able to figure
<br>out what was happening, but didn't think that behaviour matched the<br>documentation of $c-&gt;model.&nbsp;&nbsp;The behaviour might make sense if<br>'_comp_singular()' were named '_comp_first_in_hash()' and $c-&gt;model<br>were documented as such, but as it currently is I presumed it would
<br>have died or returned nothing if multiple components matched, instead<br>of an apparently random component.</blockquote><div><br><br>The documented behavior of $c-&gt;model is that it requires either an argument, or a configuration setting called &quot;default_model&quot;.&nbsp; If there is any flaw in 
<a href="http://Catalyst.pm">Catalyst.pm</a> with regard to your issue, its that it isn't throwing an exception when you call $c-&gt;model with no argument and no preset &quot;default_model&quot;.&nbsp; The docs only indicate returning something with no args/default for Views, not Models, and even then only if only a single View exists.&nbsp; With DBIC::Schema, a Model is created for every table, so you can't have just one Model.
<br>&nbsp;</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">&nbsp;&nbsp;sub _comp_singular {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my ( $c, @prefixes ) = @_;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $appclass = ref $c || $c;
<br>-&gt;&nbsp;&nbsp;&nbsp;&nbsp;my ( $comp, $rest ) =<br>-&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;map { $c-&gt;_comp_search(&quot;^${appclass}::${_}::&quot;) } @prefixes;<br>-&gt;&nbsp;&nbsp;&nbsp;&nbsp;return $comp unless $rest;<br>&nbsp;&nbsp;}<br><br>Do the last two lines here make sense as well?&nbsp;&nbsp;If so, I think they
<br>could maintain the same behaviour if the last line were changed to the<br>more transparent &quot;return $rest || $comp&quot;.&nbsp;&nbsp;For example:<br><br>&nbsp;&nbsp;&gt;&nbsp;&nbsp;perl -e 'sub foo { my ($comp, $rest) = (1,2); \<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $comp unless $rest;} \
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print foo(). &quot;\n&quot;;'<br>&nbsp;&nbsp;&gt; 2<br><br>But is the desired behaviour really to return the first hash-order<br>matching from component using the second element of @prefix if one is<br>found, otherwise to return the first hash-order matching item from the
<br>first element of @prefix?&nbsp;&nbsp;If it is, I think an explicit return value<br>might it clearer that this is the intended behaviour. :)</blockquote><div><br>I haven't tested it myself to see if there's a problem here, but the intended behavior is completely different than what you describe.&nbsp; The intended behavior is that _comp_singular return a component name if and only if there's only a single matching component.&nbsp; It should return nothing if there's more than one match.
<br></div><br></div>-- Brandon<br>