http://qs321.pair.com?node_id=1218278


in reply to Re: object oriented Perl advice / constructor creation in child class
in thread object oriented Perl advice / constructor creation in child class

Yes, I agree its time to use Moose.

My wild guess says

Tie::Hash might be something I can utilize here but since never used before so finding it difficult use. Can Tie::Hash be used ?

  • Comment on Re^2: object oriented Perl advice / constructor creation in child class

Replies are listed 'Best First'.
Re^3: object oriented Perl advice / constructor creation in child class
by haj (Vicar) on Jul 11, 2018 at 09:43 UTC

    Sorry, but I don't see how Tie::Hash would help you here.

    In another reply you write that all your classes A to D already exist and have their own new methods, so Moo(se) inheritance (which makes Moose classes inherit from other Moose classes) isn't easily done either. As others have explained, Perl's method resolution with mro might help to some extent, but I doubt that it is worth the trouble. In any case you need to understand which of the methods you want to have available through the interface of C::C1 objects, especially with regard to their new methods.

    On whatever I've seen so far, I'd go for the delegation approach. The the existing classes don't have to be Moo(se) classes, and you explicitly implement the methods you want to make available through your C::C1 objects, and you can decide who should construct your A to D objects.

    package C::C1; # That's the perlish name for the module use File::FindLib 'lib'; use A; use B; use C; use D; sub new { return bless({ _a => A->new->bar, # I don't understand bar here _b => B->new->bar1, # nor bar1 here _c => C->new(), _d => D->new(), }, shift); } # now for any method of A: sub a_method_1 { my $self = shift; $self->_a->a_method 1(@_); } # etc # And for any method of B: sub b_method_1 { my $self = shift; $self->_a->b_method 1(@_); } # etc # Repeat for C and D, ad libidum.

    Maybe you want your users to read/write A to D? Here's an example for D:

    sub new_d { my $self = shift; if (@_) { $self->{_d} = D->new(@_); } return $self->{_d}; }
    Someone using C::C1 would write like this:
    use C::C1; my $c1 = C::C1->new; $c1->a_method_1(); # will execute A::a_method_1 $c1->b_method_1(); # will execute B::b_method_1 $c1->new_d(@params) # will execute $self->{_d} = D->new(@params)

    Moo or Moose can help to make your C/C1.pm more readable, because they have keywords for method delegation, as I've shown in my previous example. But before going deeper, I'd like to understand how the interface of your C/C1.pm should look like.