NAME
Class::Prototyped::Mixin - Mixin Support for Class::Prototyped
SYNOPSIS
Usage one: whip up a class and toss it in a scalar
package HelloWorld;
sub hello {
my ($self, $age) = @_;
return "Hello World! I am $age years old"
}
package HelloWorld::Uppercase;
use base qw(Class::Prototyped);
__PACKAGE__->reflect->addSlot(
[qw(hello superable)] => sub {
my $self = shift;
my $ret = $self->reflect->super('hello', @_);
uc $ret
}
);
package HelloWorld::Bold;
use base qw(Class::Prototyped);
__PACKAGE__->reflect->addSlot(
[qw(hello superable)] => sub {
my $self = shift;
my $ret = $self->reflect->super('hello', @_);
"$ret";
}
);
package HelloWorld::Italic;
use base qw(Class::Prototyped);
__PACKAGE__->reflect->addSlot( [qw(hello superable)] => sub { my $self =
shift; my $ret = $self->reflect->super('hello', @_); "$ret"; } );
# script.pl - now the whipping begins
use Class::Prototyped::Mixin qw(mixin);
my $runtime = mixin(
'HelloWorld' => 'HelloWorld::Uppercase', 'HelloWorld::Italic'
);
print $runtime->hello(74);
HELLO WORLD! I AM 74 YEARS OLD
Usage two: create hierarchy and install in a Class::Prototyped package
package CompileTime;
use Class::Prototyped::Mixin qw(mixin);
my $uclass = mixin(
'HelloWorld' => 'HelloWorld::Uppercase', 'HelloWorld::Bold'
);
__PACKAGE__->reflect->addSlot(
'*' => $uclass
);
# script.pl
use CompileTime;
print CompileTime->hello(88);
HELLO WORLD! I AM 88 YEARS OLD
DESCRIPTION
This module makes it easy to layer functionality on base functionality
via a collection of mixin classes. The SYNOPSIS is admittedly easier
done via a "fold" or some other pure functional approach. However, the
case for intelligent, "performant" mixins is argued strongly here:
To date, the Mixin contributions to CPAN use class-based OOP, with
Class::MixinFactory being perhaps the most complete and best documented.
This module is one of a series designed to show the flexibility,
simplicity and power of prototyped-based object programming.
The reason I wish to address object-oriented design concerns in
prototype-based object-oriented programming is that it is simple,
flexible and seems to involve less confusion than I see evolving with
Perl class-based oop. For awhile there was interest in roles. Now there
is interest in traits. And there has always been a long-standing
interest in mixins, decoration, and delegation.
I cringe at the thought of trying to get all of these technologies to
meld in a large project. I cringe equally at those who talk and do not
do: The last thing that is necessary is for me to SAY that
prototyped-based oop can address real-world concerns yet not
DEMONSTRATE.
AUTHOR
Terrence Brannon
CPAN ID: TBONE
metaperl.com
metaperl@gmail.com
http://www.metaperl.com
SOURCES
Distributed on CPAN.
CVS access is via:
cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/sw-design login
cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/sw-design co -P modulename
COPYRIGHT
This program is free software; you can redistribute it and/or modify it
under the same terms as Perl itself.
The full text of the license can be found in the LICENSE file included
with this module.
SEE ALSO
perl(1).
METHODS
mixin
Usage : Class::Prototyped::Mixin::mixin($base, $derived, $derived_two, ..)
Purpose : Dynamically build an object with the specified inheritance
Returns : a Class::Prototyped object
Argument : a list of classes, starting from the root class and moving
down the hierarchy
Throws : Returns undef if at least 2 classes are not passed in for mixing
Comment : This is a sample subroutine header.
: It is polite to include more pod and fewer comments.