On 5/16/05, Rhesa Rozendaal <[EMAIL PROTECTED]> wrote:
> [EMAIL PROTECTED] wrote:

Hi!!!

Many thanks to you, and Sam, for the replies!!!

> > This may not be strictly a CGI::Application question, but I
> > thought I'd ask here... this is my first attempt at using this
> > (and it appears *very* useful!).  I may not be grokking
> > something about perl OOP.
> >
> > I wanted to add an auth object to my application, so
> > I created something like this:
> >
> > package myApp::Auth;
> >
> > use warnings;
> > use strict;
> > use Exporter ();
> > our @ISA = qw( Exporter );
> > our @EXPORT = qw( new login );
> > our @EXPORT_OK = qw( new login );
> 
> Here's your problem: you're exporting "new" by default, so you're _replacing_ 
> the "new" in your CgiApp derived package. That's _not_ what
> you want at all, of course. Note that _replacing_ is something completely 
> different from _overriding_.
> Remove everything to do with Exporter. Typical OO code does not have to 
> export anything, since your object will wrap all you need from it.

There was my "doh" moment!  Thank you, you're absolutely correct!!! 

> You should be using your own object like this:
> 
>    use myApp::Auth;
> 
>    my $auth = myApp::Auth->new( <arguments> );   # perl knows where to look 
> for new() !
>    $auth->perform_some_method();

Yes!

> You could instantiate your object in CgiApp's setup() method, save it as a 
> param(), and access it from there:
> 
> # in myApp::test (your CgiApp derived class)
> 
> sub setup {
>    my $self = shift;
> 
>    # store auth object
>    $self->param( auth => myApp::Auth->new( <args> ) );
> 
>    # more setup here
> }

Yes, I did something similar for a Config::IniFiles object.  But 
since I don't know much during setup, does it make more sense 
to do this during a subsequent run mode after I've acquired the 
needed credentials?

> # use it in a run mode
> sub foo {
>    my $self = shift;
> 
>    my $auth = $self->param('auth');
>    $auth->make_some_check();
> 
> }
> 
> >
> > When I use this from a simple script, everything is fine.
> > When I use it from within the CGI::App derived class (test)
> > via an instance script, I get:
> >
> > Can't local object method "_module" via package "myApp::test"
> 
> See? You exported new, but not _module. the call to new lives in myApp::test 
> now, so it's looking for methods in the current package.
> 
> > So, some kind of namespace issue due to the fact that the
> > caller is an object (an instance of CGI::Application), it seems...
> > Any ideas about what lame-brain mistake I've made will be
> > greatly appreciated!!
> 
> Don't use Exporter unless you're exporting real functions or procedures. Read 
> up on OO in perl (perldoc perlboot etc).

Trying to combine two different paradigms didn't help me!  ;-)

> HTH,

No question!  

Sam, your advice was perfect, but I'm perhaps too impatient.  When 
you run before you can walk, you're bound to trip, skin your nose and 
break some teeth.  I guess I have to learn the hard way!  ;-)   For this 
application, I definitely need to abstract several interfaces, including 
run modes (some can be user-supplied, handled by a built-in generic 
method, or...), authentication, and backend datastore (e.g. dB or 
LDAP).  So my feet were already moving when I hit the ground; 
just not fast enough this time!

Thanks again, Rhesa!

-r

---------------------------------------------------------------------
Web Archive:  http://www.mail-archive.com/[email protected]/
              http://marc.theaimsgroup.com/?l=cgiapp&r=1&w=2
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to