I am still not clear about the implementation. Is sub foo {} in a different package or in Obj.pm?Both. The actual foo functionality is contained within Foo::foo, while Obj::foo is the exact code from my example - it just references its internal Foo instance and passes calls off to its foo method.
Here's a complete runnable demonstration:
The print in Obj::foo isn't necessary, of course, and you normally wouldn't do anything there other than delegating the call to the aggregated object. I just threw it in to demonstrate the control flow more clearly.#!/usr/bin/perl use strict; use warnings; my $obj = Obj->new; if ($obj->foo) { print "\$obj->foo called Foo::foo\n"; } else { die "Foo class was not touched!\n"; } package Foo; sub new { return bless { }; } sub foo { print "In Foo::foo, where the work gets done.\n"; return 1; } package Obj; sub new { return bless { _foo => Foo->new }; } sub foo { my $self = shift; print "In Obj::foo and about to pass the buck.\n"; return $self->{_foo}->foo(@_); }
It may also be worth noting that, if Obj and Foo were in their own separate modules (instead of everything being in one file as in my example), applications would only need to use Obj to gain access to the functionality of $obj->foo. The implementation of Obj::foo and the existence of an internal Foo instance are completely opaque to them, so they would not need to use Foo unless they want to create their own independent Foo instances outside of their Objs.
In reply to Re^3: Designing an OO program with multiple inherited classes
by dsheroh
in thread Designing an OO program with multiple inherited classes
by punkish
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |