http://www.perlmonks.org?node_id=1019948


in reply to Re: Perl semi-object without a constructor
in thread Perl semi-object without a constructor

"Why do you think $conn has no methods? "
Because of my ignorance of the nuances of Perl classes and objects. All of the texts I looked at started with a package and a sub called 'new' to create the object. I had been looking at Msg.pm as a way to carve out and localize a set of functions and have a cleaner organization. That is the only usage I knew about for packages.

This exploration has been enlightening, and gives me a new light to look at Perl packages. The simple explanation of:

The first argument is the string "Msg" - that is, the part before the ->. This is how method calls work in Perl (we borrowed it from Python); the thing before the arrow gets passed in as the first argument.
Is the key that I never found in my frantic scanning of my library; I didn't find an explanation of the mechanics, just the conceptualization of OO.

Thanks a bunch! odd, ending my text with an exclamation point messes up formatting.

!-- Node text goes above. Div tags should contain sig only -->

It is always better to have seen your target for yourself, rather than depend upon someone else's description.

  • Comment on Re^2: Perl semi-object without a constructor

Replies are listed 'Best First'.
Re^3: Perl semi-object without a constructor
by tobyink (Canon) on Feb 21, 2013 at 17:37 UTC

    "All of the texts I looked at started with a package and a sub called 'new' to create the object."

    It is convention to name constructors new but there's no requirement to do so. You could just as well call it old or frangipane and it would make not one whit of difference to the Perl interpreter. But the reason that you should call a constructor new (and not old or frangipane) is for humans reading your code. When they see new they'll know precisely what that method call is doing!

    That said, it's quite common for a class to define additional constructors such as new_from_json or new_from_yaml in addition to their standard new constructor. These are often wrappers around new that do additional pre-processing or post-processing.

    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name