volks,
Ok, so let's start with the simples stuff, I'm not God's
brightest child - so I tend to try stuff, and argue with
myself about whether or not a thing makes sense. Here is
the basic problem.
I need to have a base class
FOO::BAR
from which I will have a secondary class
FOO::BAR::BAZ
but for 'political Reasons' I want to have
a new class that is 'derived' from FOO::BAR::BAZ
but it needs to be 'hung' ass
FOO::BAR::BOB
So while muddling this affair I opted to do the following
trick in the FOO::BAR class package:
# our private defaults - things starting in a Capital
# are 'public' elements, things in 'lower case', should
# NOT be messed about by anyone but this module...
# caveat emptor
our %def =(
Exposed_A => undef,
Exposed_B => 666,
Exposed_C => 'frodo',
private_fd => undef,
);
#------------------------
# So that we have a way to redefine our Values.
sub redefine {
my $me = shift;
if ( @_ % 2 ) {
$me->{'Exposed_A'} = shift;
# only suppose to hand me the Single Arg...
die "Odd Number of args passed to redefine: @_ \n" if @_;
} else {
# this seems to be required to allow sub_classing
# hence we can not get away with some of the dope we have done
my %hash = (@_);
while( my ($k,$v) = each %hash ) {
if ( $k eq 'fd' ) {
me->CloseOut() if defined($me->{private_fd});
$v = undef unless ( ref($v) eq "PRIVATE::TYPE");
}
$me->{$k} = $v ;
}
}
$me->{private_fd} = new PRIVATE::TYPE
unless defined $me->{private_fd};
} # end of redefine
#------------------------
# so that the NEW remains almost as virgin as possible
sub _init {
my $me = shift;
# load our defaults
while( my ($k,$v) = each %def) {
$me->{$k} = $v ;
}
$me->redefine(@_) if @_;
# so that we always have a New One of these
$me->{private_fd} = new PRIVATE::TYPE
unless defined $me->{private_fd};
} # end of _init
#------------------------
# So that we have our _init do our initializing
sub new {
my $type = shift;
my $self = {};
my $class = ref($type) || $type ;
bless $self, $class ;
#
# this may bother some with the subsequent sub_classing
#
$self->_init(@_);
$self;
} # end New
The new is basically stock out of the manual - save for my choice
to allow an '_init()' - that is from the old naming convention,
one "_" is an application specific thingie - in this case one of
our 'private' methods - but since I may need to pass thru re-definitions,
why not have a 'redefine' - where I can stuff all of MY personal
requirements for how this class should be doing it.....
I think I should 'expose' the redefine() method - so that other sub_classes
can use it... in this sense, point to it in the POD - since I really can
not think of a way to expressly prevent them from using it. I found that
having this redefine() allows me 'back door' updates in my
own methods where I use tricks like
sub do_me_now {
my $self = shift;
$self->redefine(@_) if @_;
.....
}
So far - I think I am well within Kosher, since in the
FOO::BAR::BAZ I do the old
package FOO::BAR::BAZ;
....
our @ISA = qw(FOO::BAR);
steal the very same 'new' method - cut and paste, and out
and away we go.... BadaBoom, badaBing - the new in this class
updates the stuff I want to have initialized in the base class
as well.... So Far - no major worry. I mean not a lot of additional
typing so far - we add a few more basic methods of this BAZ stuff
that are uniq from the FOO::BAR style and all is kosher. { at
least the code works. }
So we gin up the FOO::BAR::BOB package - and skate it along as
being one of the
package FOO::BAR::BOB;
....
our @ISA = qw(FOO::BAR::BAZ);
and what is sauce for the GOOSE, is sauce for the gander.... so
we put in our own collection of Bob's def Jam Players -
our %def =(
Exposed_A => 'funnyThing',
BOB_A => 'special Sauce',
BOB_B => 'Where The Dinasaour',
private_a => undef,
);
# yes - that is the Exposed_A we want to by default reset
# in our base_class.... the Other's are MINE!!!
#------------------------
# So that we have our _init do our initializing
sub new {
my $type = shift;
my $self = {};
my $class = ref($type) || $type ;
bless $self, $class ;
#
# this may bother some with the subsequent sub_classing
#
$self->_init(%def,@_);
$self;
} # end New
As you can see - this new is like the other news... except that
we have some 'defaults' we want to pass in "first" - that can
be over-ridden by the endUser's own set....
So It works... I know... I have tested it.... I'm just a bit
nervous about whether or not this is a Kosher Approach....
What are the Gotcha's I haven't thought about in this process????
ciao
drieux
---
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]