sub define { my $self = shift; my $type = shift || croak "No type name"; unless ($template) { local $/ = undef; $template = ; } my ($code, $parent, $subclass) = ($template, __PACKAGE__, __PACKAGE__ . "\::$type"); $code =~ s,##PACKAGE##,$subclass,g; $code =~ s,##PARENT##,$parent,g; { my $WARNING = ''; local $SIG{__WARN__} = sub { $WARNING = "@_" }; eval $code; croak "Failed to create subclass: $subclass - $WARNING$@" if $WARNING || $@; croak "Problem with subclass: $subclass - cannot new()" unless $subclass->can(qw/new/); } print STDERR "Created type: $type\n"; }