#!/usr/bin/perl -w
use strict;
package Object;
sub new { return bless {}, shift; }
sub speak { print shift() . " says hello\n"; };
package mixin_simple;
sub yell { print shift() . " says HELLO\n"; }
package mixin_shadow;
sub speak { print shift() . " whispers hello\n"; };
package main;
sub mix {
my ( $object, @classes ) = @_;
push @classes, ref $object;
my $package_name = join ( '_', @classes );
my $package_list = join ( ' ', @classes );
my $declaration =
"package $package_name; use base qw($package_list);";
eval $declaration; die "declaration error: $@\n" if $@;
return bless $object, $package_name;
}
my $obj = Object->new;
$obj->speak;
mix ( $obj, 'mixin_simple' );
$obj->speak;
$obj->yell;
print "object is still an Object\n" if $obj->isa('Object');
my $whisperer = Object->new;
mix ( $whisperer, 'mixin_shadow' );
$whisperer->speak;
print "whisperer is still an Object\n" if $whispererpk->isa('Object');
####
sub mix {
my ( $object, @classes ) = @_;
push @classes, ref $object;
my $package_name = join ( '_', @classes );
my $package_list = join ( ' ', @classes );
my $check = "package $package_name; \$declared";
unless ( eval $check ) {
print " -- creating new package $package_name -- \n";
my $declaration =
"package $package_name; use base qw($package_list);
use vars '\$declared'; \$declared++";
eval $declaration;
die "declaration error: $@\n" if $@;
};
bless $object, $package_name;
}
####
picture
XML::Comma::Mixin::Standard_Image
XML::Comma::Mixin::Auto_Versioning