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', @_);
        "<b>$ret</b>";
      }
     );

     package HelloWorld::Italic;
     use base qw(Class::Prototyped);

__PACKAGE__->reflect->addSlot( [qw(hello superable)] => sub { my $self = shift; my $ret = $self->reflect->super('hello', @_); "<i>$ret</i>"; } );

     # script.pl - now the whipping begins
     use Class::Prototyped::Mixin qw(mixin);
     my $runtime = mixin(
         'HelloWorld' => 'HelloWorld::Uppercase', 'HelloWorld::Italic'
     );

     print $runtime->hello(74);
     <i>HELLO WORLD! I AM 74 YEARS OLD</i>

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);
     <b>HELLO WORLD! I AM 88 YEARS OLD</b>

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: <http://www.mail-archive.com/sw-design@metaperl.com/msg00060.html>

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.