Sunday, June 30, 2002, 5:57:23 PM, drieux wrote:

I don't know if it's just me, but I didn't really understand
what you're actually trying to achieve...

> 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

This sounds straightforward:

  package FOO::BAR::BOB;
  use base 'FOO::BAR::BAZ';

> 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

But then you start mentioning public and private variables,
and other things.

>         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 {

What is this "redefine" supposed to do?


>                 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");
>                         }

And what's a PRIVATE::TYPE?

Perhaps some more explanation about what you're trying to
do here would be useful.


--
Best Regards,
Daniel                   [EMAIL PROTECTED]


>                                 $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