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


in reply to Re: Creating dynamic parent/child relationships
in thread Creating dynamic parent/child relationships

I'm looking into this possibility now. I've used roles with Moose and so I'm familiar with them. In my particular case, the plugins I want to use contain identical method names. So will that make the use of Roles impossible?

$PM = "Perl Monk's";
$MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
$nysus = $PM . ' ' . $MCF;
Click here if you love Perl Monks

Replies are listed 'Best First'.
Re^3: Creating dynamic parent/child relationships
by hippo (Bishop) on Sep 04, 2019 at 12:58 UTC

    Why would it? SSCCE:

    use strict; use warnings; package Foo; use Moo; package Trapezist; use Role::Tiny; sub swing { print "Whoooosh!\n"; } package Trumpeter; use Role::Tiny; sub swing { print "1, 2, ... 1, 2, 3, 4, Hit it!\n"; } package main; my $person1 = Foo->new; Role::Tiny->apply_roles_to_object ($person1, 'Trapezist'); my $person2 = Foo->new; Role::Tiny->apply_roles_to_object ($person2, 'Trumpeter'); $person1->swing; $person2->swing;

      Nice. But how the F all you guys make coming up with these suggestions so effortless is beyond me. :)

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

      Well, so far, so good. This approach looks very promising. I've converted one module over so far and it works. Thanks a lot.

      One thing I wanted to accomplish with this module is to get a much better feel for OO Perl. I'm not sure what goes on under the hood with roles. My old Damian Conway book from like 2000 makes no mention of them. You know any good resources for learning about how they accomplish their jobs? I noticed the classes get tacked with a __WITH__ and then the name of the role.

      $PM = "Perl Monk's";
      $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
      $nysus = $PM . ' ' . $MCF;
      Click here if you love Perl Monks

        Roles are not part of the Perl language so they must be implemented via modules. The minutiae of the mechanisms for implementing roles will depend on which module you use. As ever, if you want to know the implementation details you only need to look in the source.

        More recent books such as Modern Perl by chromatic do mention roles but (quite reasonably) don't delve into the underlying mechanisms.

Re^3: Creating dynamic parent/child relationships
by nysus (Parson) on Sep 04, 2019 at 12:50 UTC

    Maybe the solution is to precede the subs with some kind of unique identifier for each of the packages that the calling package can look up.

    $PM = "Perl Monk's";
    $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
    $nysus = $PM . ' ' . $MCF;
    Click here if you love Perl Monks

      ... most likely, Roles are just the wrong tool. Roles are just inheritance in disguise and only make sense when you have mostly identical behaviour that you want to customize in small parts.

      What you have is a set of behaviours that you want to arrange in a sequence, potentially leaving out some parts. This is not easily modeled by inheriting things and much easier modelled by an array that contains the steps.

        Thanks, Corion. Yes, I tried your advice. Unfortunately, it appears my classes are too reliant on inheritance and I can't implement your idea in any sane way. It seems that if I treat the classes as nothing more than containers for methods using your suggestion, I lose access to the data in the attributes contained in the parent classes. My child objects need access to the parent attributes to work.

        $PM = "Perl Monk's";
        $MCF = "Most Clueless Friar Abbot Bishop Pontiff Deacon Curate Priest Vicar";
        $nysus = $PM . ' ' . $MCF;
        Click here if you love Perl Monks