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.
|