|Think about Loose Coupling|
CGI::App dynamic runmodes/modulesby Ryszard (Priest)
|on Oct 15, 2006 at 17:26 UTC||Need Help??|
Ryszard has asked for the
wisdom of the Perl Monks concerning the following question:
I've got a bit of a problem with my web application and a CGI::Application framework.
let me explain a little.
I've written a module based on CGI::Application, and every other module i use inherits from it (ie when writing another module i do 'use base CGIA::Replacement'; )
My web app has "registered" users (ie users that will log in via the website, session stored in the database etc etc). Each user belongs to a group, and that group has specific attributes.
My goal is to create (from a dev/admin POV) a "My Website" framework, where i can just program another module, add it to the $path, update a database table and the content/functionality will be automatically added to the greater application.
Now (bear with me a bit while i share some detail), i've got a database table that maps a group with a feature (for example "upload file"), and (for the sake of normalisation) i have a mywebsite_feature table that maps a library to that feature.
From this setup i can dynamically pull in (at run time via require) whatever libraries are associated with the group of the user logged in. With a "special" method in the library, i can return the method(s) i would like the application to access (such as showTemplate(), or storeFile() )
what i'm having trouble with is the mechanics in accessing the dynamically added runmode.
so, in summary, what i want is a CGI::Application based module that will dynamically use other modules and dynamically add run modes based on the output of a "special" method in the dynamically loaded module.in closing, i have two remarks:
1) i cant but help think this is quite a messy approach to doing this
2) (disclaimer) i've been working at this for hours now, and perhaps cant see the wood for the trees
If anyone has experience in doing this, or suggestions on how it could be done better, i would love to hear it.