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]

Reply via email to