in reply to Object loading at runtime

One way ( this was discussed in the CB recently ) is to use a factory, e.g.:
#!/usr/bin/perl use warnings; use strict; package Class; sub new { bless {}, $_[0] }; 1; package Class::SubclassA; sub new { bless {}, $_[0]; }; 1; package Class::SubclassB; sub new { return bless {}, $_[0]; }; 1; package ClassFactory; my %creation_hash = ( SubclassA => sub { Class::SubclassA->new() }, SubclassB => sub { Class::SubclassB->new() } ); sub create { shift; print $creation_hash{$_[0]}, "\n"; return $creation_hash{$_[0]}->(); } 1; package main; my $a = ClassFactory->create( "SubclassA" ); my $b = ClassFactory->create( "SubclassB" ); print $a, "\n"; print $b, "\n";

Replies are listed 'Best First'.
Re^2: Object loading at runtime
by merlyn (Sage) on Jun 16, 2005 at 20:37 UTC
    Don't hardcode the daughterclass names, or else you won't be able to subclass the factory class. Instead, call a method that returns the daughterclass name:
    sub TypeA { return "Class::SubclassA" } sub TypeB { return "Class::SubclassB" } sub create { my $class = shift; if (shift eq "B") { return $class->TypeB->new(@_); } else { return $class->TypeA->new(@_); } }

    -- Randal L. Schwartz, Perl hacker
    Be sure to read my standard disclaimer if this is a reply.