LesleyB has asked for the wisdom of the Perl Monks concerning the following question:
Hi
I have this instance script
#!/usr/bin/perl -T use Bufferlass; use lib '/home/pgcroft/sites/bufferlass.org.uk/trunk/src/'; use strict; use warnings; ## The Instance script ## can contain ## new(), run(), ## new make take the params TMPL_PATH, QUERY, PARAMS as hashes of valu +es ## e.g. TMPL_PATH => 'MyApp/' ## QUERY is an already existing CGI query object ## PARAMS => { 'custom_thing_1' => 1, 'custom_thing_2' => '20 +', 'another' => qw/123 456/ } my $bufferlass = Bufferlass->new(); $bufferlass->run();
and this module
package Bufferlass::Bufferlass; use base 'CGI::Application'; use strict; ## ## methodology ## Subclassing and Override mehods. ## this module must define the setup(), teardown(), cgiapp_init(), cgi +app_prerun(), cgiapp_postrun(), cgiapp_get_query(), delete() ## Application Module Methods ## delete(), dump(), dump_html(), error_mode(), get_current_runmode(), + header_add(), header_props(), header_type(), load_tmpl() ## mode_param(), param(), prerun_mode(), query(), run_mode(), start_mo +de(), tmpl_path() # ## ## Subclassing and Override methods ## sub setup { ## called by inherited new structure ## should contain ## mode_param() ## start_mode() ## error_mode() ## run_modes() ## tmpl_path() ## is a good place to to define properties specific to the application + using the $webapp->param() approach ## can simply be a defn of run_modes and start_mode } sub teardown { ## called *automatically* after application runs ## clean up after operations ## e.g. disconnect database connection established in setup() ## can also be used to store info about the app on server } sub cgiapp_init { ## called *automatically* just before the setup() me +thod ## provides an optional initialisation hook ### receives all the parameters sent to the new() method ## could be used in an application superclass which inherits CGI::Appl +ication then base all web-based applications on this. ## thereby having a suite of applications that share particular charac +tertistics } sub cgiapp_prerun { ## called *automatically* before a selected run_mo +de ## provides an optional pre_run mode hook ## receives the value of the run_mode ## as with cgiapp_init the cgiapp_prerun could be places in a supercla +ss based on CGI::Application ## subsequent applications based on the superclass would then inherit +similar characeritsics. } sub cgiapp_postrun { ## will be called after a run_mode has finished b +ut before HTTP headers are generated ## receives a reference to output from a run method in addition to the + CGI-App object ## useful when ## want to emclose the output in further HTML ## run_mode returns structured data such as XML which needs to be t +ransformed in some way e.g. via XSLT ## post-process CGI-App output through something like HTML::Mason ## need to modify HTTP headers in a particular way across all run_m +odes ## have access to all CGI-App object methods normally available in a r +un_mode ## could use load_tmpl() to change the template used ## could change the headers to a redirect via header_type() and header +_prop() methods. ## could make changes only when in a certain run_mode and with certain + param() value . } sub cgiapp_get_query { ## loads CGI.pm via require. ## returns a CGIquery object ## can be overridden to use a different query object which must be com +patible with CGI.pm or wrap chosen ## query interface in a wrapper class to achieve compatibility } ## ## Inherited Methods ## sub delete { ## deletes a parameter previously stroed via PARAMS param +eter to new() or param() method. ## Useful where application makes decisions on existence of certain pa +rameters } sub dump { ## debugging function ## retruns text containing the environment and web-form data of the re +quest ## human readable format } sub dump_html { ## debugging function ## returns environment and web-form data of request ## human readable via browser } sub error_mode { ##contains name of run_mode to call when planned run_ +mode fails ## death not trapped so can die here } sub get_current_runmode { ## returns name of run_mode being run as tex +t scalar ## will return undef if the run mode has not been initialised e.g. in +setup() } sub header_add { ## adds headers to the outgoing response headers. ## refer to CGI.pm docs on header() for exact usage. ## preserves existing headers, ## scalar value replaces existing value for that key ## array ref values appended to existing values for that key ## useful for setting an additional cookie after one has been set } sub header_props { ## expects a hash of CGI.pm compatible HTTP header +properties ## these values will be passed to the CGI.pm header() and redirect() m +ethods ## clobbers existing headers ## works in conjunction with header_type() method } sub header_type { ## expects 'header', 'redirect', 'none' ## specifies type of header to be sent back to browser ## defaults to header ## 'none' hides headers } sub load_tmpl { ## expects name of a template file, reference to templ +ate data or a FILEHANDLE ## returns an HTML::Template object ## defaults to the name of the run_mode with the extension '.html' if +argument not found ## uses HTML::Template methods for arguments ## sets HTML::Template path option if tmpl_path() value set ## sends remaining parameters to relevant HTML::Template method ## can be overrridden to enable use of other templating systems such a +s TT or Petal } sub mode_param { ## accessor/mutator method ## generally called via setup() ## determines run mode to call ## takes string, code reference, or uses $ENV{PATH_INFO} via path_info + => n } sub param { ## sets application instance properties accessible through +out application ## sets or gets ## retruns an array of all currently existing paramaetrs if used in ar +ray context ## set lots of params using hash or hashref ## useful where similar applications need to share code base } sub prerun_mode { ## accessor/mutator changing the run mode about to b +e executed ## e.g. force back to login page ## may only be called in the context of a cgiapp_prerun() method. } sub query { ## retrieves CGI.pm query object ## new() method creates one automagically or uses that of the QUERY pa +rameter } sub run_modes { ## accessor/mutator specifies dispatch table for appli +cation states ## arrayref of run mode names that represent the subroutine names dire +ctly ## hashref allows use of anternative name or code ref ## can be called multiple times with new values for existing run_modes + overwriting existing values ## and adding new ones ## run method uses this data to send application to correct function b +y reading the CGI paramater specified by mode_param() ## and defaults to 'rm' for run mode. ## use AUTOLOAD to catch exceptions on non-existent run modes } sub start_mode { ## contains the name of mode as specified by the run_ +modes() table ## The mode key specified here will be used whenever the value of CGI +form parameter specified bu mode_param() ## is not defined - typically the first time an application is execute +d. } sub tmpl_path() { ## accessor/mutator sets/gets path to directories wh +ere templates are stored ## accepts text scalar or array ref of multiple paths. ## used by load_templ to find template files ## uses HTML::Template path option } 1;
I would really like to develop outside the /var/www and standard @INC directories - just to get the basics working.
Hence the use lib '...'; statemnt in the instance script. However I get the error
Can't locate Bufferlass.pm in @INC (@INC contains: /etc/perl /usr/loca +l/lib/perl/5.8.8 /usr/local/share/perl/5.8.8 /usr/lib/perl5 /usr/shar +e/perl5 /usr/lib/perl/5.8 /usr/share/perl/5.8 /usr/local/lib/site_per +l) at ./bufferlass.cgi line 2. BEGIN failed--compilation aborted at ./bufferlass.cgi line 2.
which means that my module is not being seen and the path to it doesn't appear to be added to @INC.
The directory structure is
./bufferlass.cgi
./Bufferlass/Bufferlass.pm
I've managed to get progress using
perl -T -I/home/pgcroft/sites/bufferlass.org.uk/trunk/src/Bufferlass +bufferlass.cgi Can't locate object method "new" via package "Bufferlass" at bufferlas +s.cgi line 15.
which I am happier with (although I have yet to understand how to fix that error). At least the -I argument works.
This problem is symptomatic of previous problems I have had developing modules. Everything works okay if I use the default include directories but I would really rather not while in development. I would rather be able to specify the directory containing the module's directory and subsequent subdirs i.e. /path/to/directory/containing/module/ because this allows me wider scope that having to declare the path to each and every module as in
/path/to/directory/containing/module/Module1/
/path/to/directory/containing/module/Module2/
How can I achieve this?
I hope whatever I am doing wrong is obvious to the wise here.
Regards
L.
|
|---|