Do what you would in C++: multiple inheritance (into a subclass). A mixin class is really just a class providing behaviour. It lets you add particular methods to an existing class, without messing about with that class.
An example should make things clear...
Say we have (unrelated) classes Foo and Bar, each with a method val with similar semantics:We'd like to have a method that prints the val, but we don't want to touch our 2 classes (maybe they're not our responsibility, or maybe we also need them unadorned, or whatever... that's why we want a mixin!). Here's the mixin:package Foo; sub new { my ($class) = @_; return bless [], $class; } sub val { my $self = shift; $self->[0] = $_[0] if @_; "Foo($self->[0])"; } package Bar; sub new { my ($class) = @_; return bless { val => 'nothing' }, $class; } sub val { my $self = shift; $self->{val} = $_[0] if @_; "Bar($self->{val})"; }If we manage to get a Foo or a Bar to execute Printer::print, we get our desired behaviour.# Something to mixin package Printer; sub print { my $self = shift; my $val = $self->val; print "Value is $val\n"; }Multiple inheritance to the rescue! Define Foos that are also Printers...
Use them as you'd expect:package Foo2; use vars '@ISA'; @ISA = qw(Foo Printer); package Bar2; use vars '@ISA'; @ISA = qw(Bar Printer);package main; my $x = new Foo2; my $y = new Bar2; $x->val(17); $y->val('xyzzy'); $x->print; $y->print;
Hope this helps...
In reply to Re: Best way to do Mixin Class
by ariels
in thread Best way to do Mixin Class
by jcupp
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |