Beefy Boxes and Bandwidth Generously Provided by pair Networks DiBona
Syntactic Confectionery Delight
 
PerlMonks  

Class::Std and run-time loading.

by Pic (Scribe)
on Jan 05, 2006 at 08:17 UTC ( [id://521193]=perlquestion: print w/replies, xml ) Need Help??

This is an archived low-energy page for bots and other anonmyous visitors. Please sign up if you are a human and want to interact.

Pic has asked for the wisdom of the Perl Monks concerning the following question:

I've started to use the rather spiffy Class::Std module from CPAN to implement my classes for a mod_perl2 project I'm working on, but the classes I'm using are loaded at run-time according to how things are configured. This gives me the following warning in my error_log: Too late to run CHECK block at /usr/lib/perl5/site_perl/5.8.6/Class/Std.pm line 359.

Now, I've had a look at the Class::Std code, and line 359 is the end of a rather large check block that looks like it's making the various subroutine attributes work. From some experimentation on the CLI, it looks like CHECK blocks aren't executed when the module is loaded via eval EXPR.

Two question to this:
1) Will this break the Class::Std subroutine attributes? (I suspect that it will)
2) If this breaks things, is there a way to make them work that allows me to load my classes at run-time?

Replies are listed 'Best First'.
Re: Class::Std and run-time loading.
by Aristotle (Chancellor) on Jan 05, 2006 at 08:20 UTC
      Thanks a lot for the very quick reply. I guess it time to head over to CPAN and see what I can find there. The Object::InsideOut class linked from the bug report looks promising for one.

      That sort of "bug" is trivial to work around. Move the contents of the CHECK block into a named subroutine and then have the CHECK block call it. This allows compile-time loading of the module to still work as planned and allows runtime loading to manually compensate. You'd just call the new named function after loading your module.

      Before

      package Bad::Module; CHECK { ... # Lots of code } package Your::Code; require Bad::Module; # Error! Too late for CHECK.

      After

      package Bad::Module; CHECK { STUFF_THAT_NEEDS_DOING(); } sub STUFF_THAT_NEEDS_DOING { ... # Lots of code } package Your::Code; require Bad::Module; ... # All your code Bad::Module::STUFF_THAT_NEEDS_DOING();

      ⠤⠤ ⠙⠊⠕⠞⠁⠇⠑⠧⠊

        I know that. But that doesn’t really help CPAN users… whereas knowing that it has been reported and that TheDamian has acknowledged it and plans to offer a workaround in the next version of Class::Std is useful. :-)

        Makeshifts last the longest.

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: perlquestion [id://521193]
Approved by Corion
help
Sections?
Information?
Find Nodes?
Leftovers?
    Notices?
    hippoepoptai's answer Re: how do I set a cookie and redirect was blessed by hippo!
    erzuuliAnonymous Monks are no longer allowed to use Super Search, due to an excessive use of this resource by robots.