Hi ,
... sounds like my description wasn't the best in the world.
import is used solely for the (pure abstract) inheritor to define the interface it expects its inheritors to implement.
AUTOLOAD is used solely to catch unimplemented methods, mutators etc. and provide a categorised croak.
In outline, the implementation was along the following lines (I'm afraid I havn't got the actual code to hand at the moment - it's on a memory stick @ work & I'm working from home at the time of writing - doncha just hate it when that happens)...
package AbstractBase;
use strict;
use warnings;
use Carp qw/confess/;
use Storable qw/dclone/;
my %DEF_INTERFACE = (
methods => [],
mutators => [],
);
use vars qw/%INTERFACES/;
sub import {
my ($self, $caller) = (shift, caller);
%INTERFACES{$caller} = dclone { (%DEF_INTERFACE), @_ };
}
sub AUTOLOAD {
my $self = shift;
(my $method = $AUTOLOAD) =~ s/(.*::)//;
my $interface = $INTERFACES{$1};
croak "Abstract method not instantiated: $method" if
grep /^$method$/, @{$interface->{methods}};
croak "Mutator method not instantiated: $method" if
grep /^$method$/, @{$interface->{mutators}};
croak "Undefined interface component: $method";
}
At last, a user level that overstates my experience :-))
|