I have been studying OOP and Moose.

I stumbled upon the RJBS presentation https://cdn.oreillystatic.com/en/assets/1/event/115/Moose%20is%20Perl_%20A%20Guide%20to%20the%20New%20Revolution%20Presentation%202.pdf "Moose is Perl".

I find it instructive to write Perl 5 programs showing each example found in presentations, blogs, and tutorials.

Here is one:

Perl 5 program: mip-087-001.pl

#!/usr/bin/perl # Program name: mip-087-001.pl Run it, thusly: See C++ comment below. + Moose is Perl (i.e., MIP or mip) presentation. # From https://cdn.oreillystatic.com/en/assets/1/event/115/Moose%20is% +20Perl_%20A%20Guide%20to%20the%20New%20Revolution%20Presentation%202. +pdf. # The code below is from https://www.perl.com/pub/2002/08/13/comment.h +tml/ use Acme::Comment type => 'C++', one_line => 1, own_line => 0; /* cd C:\2020-Raku-001\ perl C:\2020-Raku-001\Perl-scripts\mip-087-001.pl */ use strict; use warnings; use feature 'say'; local $| = 1; # Forces a flush. package Employee { use strict; use warnings; use Moose; use namespace::autoclean; # Code this instead of coding "no Moose;" a +t the end of the package block. has name => ( is => 'ro', isa => 'Str', required => 1, ); has title => ( is => 'rw', isa => 'Str', required => 1, ); sub name_and_title { my ($self) = @_; my $name = $self->name; my $title = $self->title; return "$name, $title"; } 1; # Magic true value. } package Employee::Former { use strict; use warnings; use Moose; use namespace::autoclean; # Code this instead of coding "no Moose;" a +t the end of the package block. extends 'Employee'; override name_and_title => sub { my ($self) = @_; my $old = super; return "$old (Former)"; }; # Slide #85. # The + says "we're overriding the definition in our superclass. Ever +ything stays the same # except for the provided changes." # Here, we give a default. If no value is given, the default is used, + which lets us satisfy the # "required" even when no value was given in the call to the construct +or. has '+title' => ( default => 'Team Member', ); 1; # Magic true value. } # Commented out. use Employee; my $peon = Employee->new({ name => 'William Toady', title => 'Associate Assistant', }); say $peon->name_and_title; # Get name_and_title. # Commented out. use Employee::Former; my $ex_peon = Employee::Former->new({ name => 'William Toady', title => 'Associate Assistant', }); say $ex_peon->name_and_title; # Get name_and_title. # Where is the test code? Answer: Slide #87. # Name this script mip-087-001.pl my $ex_peon2 = Employee::Former->new({ name => 'William Toady', }); say $ex_peon2->name_and_title; # ===> William Toady, Team Member (for +mer) __END__
Results:
William Toady, Associate Assistant William Toady, Associate Assistant (Former) William Toady, Team Member (Former)

I recently looked at Raku after the name change. (The Windows version is actually easy to install now.)

So, after reading much of the "Think Raku" book, I tried to write counterparts to my collection of Perl 5 RJBS presentation "Moose is Perl" programs.

Well,I am stuck. (I thought Moose was 1:1 Raku OOP. Boy, was I wrong.)

Raku program attempt: mip-087-001.raku

class Employee { has Str $.name is readonly is required; # "readonly" is the defaul +t. has Str $.title is rw is required; method name_and_title { my $name = self.name; my $title = self.title; return "$name, $title"; } } class Employee::Former is Employee { method name_and_title { my $old = callsame; return "$old (Former)"; } # Slide #85. # The + says "we're overriding the definition in our superclass. Ever +ything stays the same # except for the provided changes." # Here, we give a default. If no value is given, the default is used, + which lets us satisfy the # "required" even when no value was given in the call to the construct +or. # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX # Is there not a Raku counterpart for this? # has '+title' => ( # default => 'Team Member', # ); # My poor attempt: has $.title is default('Team Member'); # XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX } # Commented out. use Employee; my $peon = Employee.new( name => 'William Toady', title => 'Associate Assistant', ); say $peon.name_and_title; # Get name_and_title. # Commented out. use Employee::Former; my $ex_peon = Employee::Former.new( name => 'William Toady', title => 'Associate Assistant', ); say $ex_peon.name_and_title; # Get name_and_title. # Where is the test code? Answer: Slide #87. # Name this script mip-087-001.raku my $ex_peon2 = Employee::Former.new( name => 'William Toady', ); say $ex_peon2.name_and_title; # ===> William Toady, Team Member (form +er)
Results:
William Toady, Associate Assistant William Toady, Associate Assistant (Former) The attribute '$!title' is required, but you did not provide a value f +or it. in block <unit> at C:\2020-Raku-001\Raku-scripts\mip-087-001.raku li +ne 60

In reply to Raku question: "Moose is Perl", but it sure ain't Raku. by Cow1337killr

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.