retaining original class hierarchy

Eric Wilhelm scratchcomputing at gmail.com
Sun Aug 6 16:46:56 BST 2006


# from Dirk Koopman
# on Sunday 06 August 2006 07:13 am:

>sub new {
>    my $class = shift;
>    my $obj = _get(shift);   # returns a Foo::TypeB
>    my $objclass = ref $obj;
>    our @{$class}::ISA = $objclass;
> ...
>package Bar; use base 'Foo'; my $obj = Foo::new('main');

Why set @main::ISA?  Even with "Foo->new('main')", you would be setting 
@Foo::ISA, which means your factory class is breaking the tree for any 
previously created (and still existing) objects at runtime -- which is 
going to hurt.  If this is a compile-time factory, that might be a 
valid approach (but could be simpler), but that's not what it sounds 
like.

A factory class should only be returning an object of some type which 
could operate standalone.  e.g. until you can "my $obj = 
Foo::TypeB->new(); $obj->do_stuff" (such as in a test), building a 
factory will be a pain.

>  In other words return, dynamically, objects with their own 'private'
>  @ISA setting. 

If (iff) you mean "every instance is in its own class with a slightly 
different inheritance tree", you'll need to generate the class (use an 
un-parseable name like 'my $classname = "LotsaObjects::--$id"') and set 
@ISA in it.  (Actually, all you need to do is make-up a name, bless the 
object as such, and set an @ISA.)

But, you probably just want to create 2-3 real classes and have your 
factory return an instance of one.

--Eric
-- 
Speak softly and carry a big carrot.
---------------------------------------------------
    http://scratchcomputing.com
---------------------------------------------------



More information about the london.pm mailing list