Herkum has asked for the wisdom of the Perl Monks concerning the following question:
I want to create generic objects if the package does not already exists. This is to keep me from creating a bunch of nearly identical modules that all do the same thing. The only thing that really changes is the package name. So I wrote this code, which I thought would work but I am not so sure.
################################################# sub _create_new_package_for { my $self = shift; my $package = _get_package_name( shift ); eval "use $package"; ## no critic return $package if not $EVAL_ERROR; my $eval_package =<<"END"; package ${package}; use strict; use warnings; use English qw( -no_match_vars ); use base 'Generic::Tree'; use base 'Generic::Container'; 1; END eval $eval_package; ## no critic croak $EVAL_ERROR if $EVAL_ERROR; return $package; }
The issue I see here is that the new 'package' does not seemed to be stored. So I can use it once, but if I want to 'use' a generic package that has already been created, it will not allow itself to be identified with a 'use' statement. So it will always eval the package code again. To me that did not seem correct. Example:
$self->_create_new_package_for( 'Testing::Package' ); $self->_create_new_package_for( 'Testing::Package' );
From the above code, I would assume, that the first time I initialize this namespace. So the second time I execute the subroutine it would be 'usable'. It is not, so what is it that I am missing and how can I fix it?
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Dynamically creat Packages
by kyle (Abbot) on Nov 04, 2008 at 17:49 UTC | |
by Herkum (Parson) on Nov 04, 2008 at 17:55 UTC | |
by kyle (Abbot) on Nov 04, 2008 at 18:02 UTC | |
|
Re: Dynamically creat Packages
by JadeNB (Chaplain) on Nov 04, 2008 at 21:00 UTC | |
by Herkum (Parson) on Nov 04, 2008 at 21:23 UTC | |
|
Re: Dynamically create Packages
by chromatic (Archbishop) on Nov 05, 2008 at 02:11 UTC | |
|
Re: Dynamically create Packages
by JadeNB (Chaplain) on Nov 09, 2008 at 21:50 UTC |