package WTF;
use strict;
use warnings;
use Carp;
sub define {
my $self = shift;
my $type = shift || croak "No type name";
my ($parent, $subclass) =
(__PACKAGE__, __PACKAGE__ . "\::$type");
my $new = sub {
my $self = shift;
bless \( my $scalar ), $subclass;
};
{
no strict 'refs';
@{"${subclass}::ISA"} = ( $parent );
*{"${subclass}::new"} = $new;
}
warn "Created type: $type\n";
}
sub import {
my $self = shift;
while (@_) {
my ($nm, $list) = splice(@_, 0 ,2);
__PACKAGE__->define($nm => $list);
}
}
1;
####
use strict;
use warnings;
use Data::Dump::Streamer;
use lib '.';
# Emulate use
BEGIN {
require WTF;
WTF->import(qw/some/);
WTF->import(qw/more/);
}
Dump(\(%WTF::some::, %WTF::more::));
####
Created type: some
Created type: more
my ($subclass,$subclass_eclipse_1);
$subclass = 'WTF::some';
$subclass_eclipse_1 = 'WTF::more';
$HASH1 = {
ISA => *WTF::some::ISA,
new => *WTF::some::new
};
*WTF::some::ISA = [ 'WTF' ];
*WTF::some::new = sub {
package WTF;
use warnings;
use strict 'refs';
my $self = shift @_;
bless \my($scalar), $subclass;
};
$HASH2 = {
ISA => *WTF::more::ISA,
new => *WTF::more::new
};
*WTF::more::ISA = [ 'WTF' ];
*WTF::more::new = sub {
package WTF;
use warnings;
use strict 'refs';
my $self = shift @_;
bless \my($scalar), $subclass_eclipse_1;
};