in reply to OO Design Advice Sought

In a similar case i have used ..

my $temp = $class; $temp =~ s/::/\\/igs; require "$temp.pm"; $instance = $class->new(@args);

I'm not sure its error proof but it works like it should.


___________
Eric Hodges

Replies are listed 'Best First'.
Re: Re: OO Design Advice Sought
by cleverett (Friar) on Nov 18, 2003 at 22:52 UTC
    I've used this in places too.

    I was worried about scoping issues: $class gets set in one package, and then gets used/requires in another package.

      You could then just make this class inherit from that base class, and overwrite a _create sub to do the class initialization

      use Physemp::Model::Account; sub _create { my $self = shift; $self->{instance} = new Phsemp::Model::Account; }

      Then you could do intialization in both the base class and the derived class, and you don't have to worry about scoping. Or you could combine the two together so that you can pass it the name of the class to create.


      ___________
      Eric Hodges
        Unfortunately, Class::DBI has a boatload of constructors:
        use Physemp::Model::Account; my $account = Physemp::Model::Account->create(); $accounts = Physemp::Model::Account->search(name => 'Ben Bitdiddle'); $account = Physemp::Model::Account->retrieve(1); my $accounts = Physemp::Model::Account->retrieve_all();

        and I'm going to need them all over the place.

        I was thinking something like this:

        package My::Browser; use base 'My::TT'; my $_cache; sub pager_class { my $class = ref $_[0] || $_[0]; $_cache->{$class} = $_[1] if @_ > 1; return $_cache->{$class}; } BEGIN { (my $temp = __PACKAGE__->pager_class()) =~ s#::#/#igr; require "$temp.pm"; } package Physemp::Admin::Clients; use base 'My::Browser'; use strict; use warnings; use Physemp::Model::Account; __PACKAGE__->pager_class('Physemp::Model::Account');

        But "My::Browser" would get compiled ahead of "Physemp::Admin::Clients". I was also thinking of using multiple inheritance, but that won't fly.

        I guess I want the equivalent of a C++ template class in Perl.