Perl 6,
I am preparing to write several classes for some Perl 6 apps I intend to craft
in support of a prominent backup suite. In looking at the documentation & some
of the modules published in the Perl 6 ecosystem, I’m not quite sure that I can
identify the best idiomatic object construction (OC) approach for my most
frequent cases that will stand the test of time. I don’t want to start writing
too many of these using my baby/teenager-Perl6 skills and then go back and
refactor ALL of them later with better OC approaches as I learn more. I’d like
to have a boilerplate OC construct that accommodates most cases, if it is
possible to zero in on one.
My most common OC case: initialize attributes at OC time from external input
that will be parsed with grammars &/| scrubbed with elaborate conditional tests.
Mu’s new() cannot assign to the class attributes, but BUILD can. I’ve used
that construct successfully, but I’m not convinced that will be the best
approach for the long term.
OC: new() { self.bless() } – BUILD() still confuses me. (I am hopeful for a
future Perl 6 book with a 40-page chapter comprehensively detailing the
responsibilities of each of these mechanisms.) I’ve read
https://docs.perl6.org/language/classtut &
https://docs.perl6.org/language/objects#Object_Construction, but I’m not
getting it all.
I’ve tried multiple approaches to initializing variables with defaults,
sometimes failing at compile time when I attempt to do it in the wrong place.
Other times, as I move things around, I break default assignments (I.e. has
$.var = ‘/tmp’) that worked magically using Mu’s new(). I am still learning by
experimentation…
The Perl 6 ecosystem has lots of clever OC constructs, but I’m still not able
to infer which I could boilerplate into an “80%-of-the-time-go-to” OC.
I just recently encountered this construct in more than one module (I.e.
https://github.com/sergot/io-socket-ssl/blob/master/lib/IO/Socket/SSL.pm6):
method new(*%args is copy) {
… # fiddle with the %args hash as required, but obviously not
attributes here
self.bless(|%args)!initialize;
}
method !initialize {
… # directly initialize attributes with conditional logic
self;
}
Is this construct a bona-fide industrial-strength Perl 6 OC idiom that I could
employ with confidence? Should I keep looking? Also, in this OC approach,
I’m not quite seeing how |%args (I.e. with %args<host> = ‘example.com’) ends up
magically as $!host (I.e. =’example.com’) in initialize(). I’ll need just a
bit more explanation to understand it.
If anyone can provide more detail on the
mechanics/expectations/responsibilities/idioms of Perl 6 OC (new() {
self.bless() } – BUILD() & more), I would appreciate your input. All educated
advice is welcome.
Thanks,
Mark