NAME
Class::Delegate - easy-to-use implementation of object delegation.
SYNOPSIS
require
Class::Delegate;
@ISA
=
'Class::Delegate'
;
$self
->add_delegate(
'some_name'
,
$a
);
$self
->add_delegate(
$b
);
$self
->do_something_that_b_knows_how_to_do();
$self
->do_something_that_a_knows_how_to_do();
DESCRIPTION
This class provides transparent support for object delegation. For more information on delegation, see Design Patterns by Erich Gamma, et al.
METHODS
- add_delegate([ $name, ] $delegate)
-
Assigns a delegate to your object. Any delegate can be named or unnamed (see the delegate() method for information on the usefulness of naming a delegate).
- resolve($methodname, $delegatename)
-
Declare that calls to $methodname should be dispatched to the delegate named $delegatename. This is primarily for resolving ambiguities when an object may have multiple delegates, more than one of which implements the same method.
- delegate($name)
-
This method returns the delegate named $name, or the empty list if there is no such delegate.
SOME DETAILS
If a delegate's class defines a package variable called @PUBLIC, then it is taken to be a list of method names that are available to be made visible through the owner object. Otherwise, all methods that are implemented by the delegate (as returned by can()
) will be available as call-throughs from the owner.
EXAMPLES
CALLING THE OWNER FROM THE DELEGATE
If the delegate object implements a set_owner()
method, then that method will be called as part of the call to add_delegate(). Example:
package
Dispatcher;
require
Class::Delegate;
@ISA
=
qw(Class::Delegate)
;
require
Worker;
sub
new
{
my
(
$class
) =
@_
;
my
$self
=
bless
{},
$class
;
$worker
= Worker->new;
$self
->add_delegate(
'gofer'
,
$worker
);
}
sub
respond_to_error {
die
"Oh no!\n"
}
...
package
Worker;
sub
new {
bless
{},
shift
}
sub
set_owner
{
my
(
$self
,
$owner
) =
@_
;
$$self
{owner} =
$owner
;
}
sub
do_something
{
my
(
$self
,
@args
) =
@_
;
if
(!
@args
) {
$$self
{owner}->respond_to_error();
}
...
}
BUGS
This class only works with owner objects that are implemented as hash references.
If you assign a new value to a named delegate, the Right Thing will not happen.
AUTHOR
Kurt D. Starsinic <kstar
@cpan
.org>
COPYRIGHT
Copyright (c) 2000, Smith Renaud, Inc. This program is free software; you may distribute it and/or modify it under the same terms as Perl itself.
SEE ALSO
perl(1).