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})"; } #### # Something to mixin package Printer; sub print { my $self = shift; my $val = $self->val; print "Value is $val\n"; } #### 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;