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