Update: Removed unfounded, baseless slur on tye. My apologies to tye. I was thinking of a post textually near his, I would have rechecked the reference except for the server & network problems mentioned in my post.
I won't mention the author I meant to refer to because, on review, he didn't not really confess, he just strongly implied that he had rather thoughtless imitated this construct. I am unique, I am the only known confessed and repentant former thoughtless user of $class = ref $class || $class

writing Packet_Foreign->new means that I have a priori knowledge that I always need a Packet_Foreign thingy. That is not the situation in the scenario at hand.

That was the scenario with the code I posted. We seem to keep referring to different scenarios and aspects of the issue. I am focused on the unclear use of $obj->new in place of Obj->new and that that muddies the meaning of $obj->new in most situations. You seem to point to $obj->new as an equivalent to (ref $obj)-new.

All I've got out of your arguments is that you wish to save five keystrokes per call, ()ref, and spend more text in the documentation of the code instead. That seems ridiculous.

It is not reasonable to attribute use of the offending idiom to "mindless imitation".

It is reasonable to consider it as a possibility. I am of fair intelligence and have admitted to repeatedly doing so myself. If you followed the links I gave, you will see others confessing also. tye comes to mind offhand. Copying the practices given by Wall, Christiansen and Schwartz is not a bad approach to learning Perl, but it is rote learning and so the label mindless imitation may apply. The writer of $obj->new does not see any reason to distinguish his code from the code of Cargo Cultists, so the reader won't know if it is Cargo Cult Code without doing extra work. The writer of ref $class || $class abets this practice.

You may have specific intent regarding the meaning of $obj->new but the poor use of the idiom means I have to be clued in by you to know your specific usage pattern and then track who is writing a piece of code. Given that you, and I, are doing so poorly in making our positions clear to one another just reinforces my feeling that the code should be as clear and informative as possible.

In the absence of compelling reasons I'll choose to avoid creating confusion over creating it and then attempting to mitigate the confusion.

I see colors and shades of grey also. Here I find no blending of shades. I have given a clear reason to habitually avoid $obj->new. You have just stated or referenced personal preferences, I don't find a reason for your preference in your posts.

Here in two lines of code the problem can be seen.

$obj->new; # Perhaps Obj->new could have been written $obj->method; # method is wrong, what class do # we start looking in to fix it?

More generally, what do you expect to happen if you call a class method as an object method?

This very discussion demonstrates that this is not a valid question for Perl. Perl has functions and methods. I think of methods being called with a first argument that specifies the class of the method and may have other uses in the method. Perl makes no meaningful distinction between class and instance methods, it is just a bit of syntax. (ref $obj)->routine( $obj) and $obj->routine contain pass the same info.

As developer of the module?

In this discussion I have been more in the role of maintainer/evolutionary expander of the client code using the classes containing the new.

As user of the module?

I hope that all the arguments are checked for validity as possible. The first argument of method just happens to set on the other side of a method's name.

I don't see your questions as relevant to the issue at hand. For me it is about clarity, as in locality of information, not about following the object-orientation style of Smalltalk or Self or C++ or ...

It is interesting that our minds find differing aspects of this discussion as being worthy of expansion. My thoughts run toward variations of
How to treat comments when reading or reviewing code?

Sorry -- Would have got back sooner but for network and server problems.


In reply to (Re:)+ $class = ref $class || $class by rir
in thread Constructor/Factory Orthodoxy by mojotoad

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.