New to “Modules as Programs”:
I (that refers to brian foy) keep wanting to name this chapter “Modulinos”, but that doesn’t mean much to someone who doesn’t have that idea yet, so I leave it as is.
For awhile, I’ve wanted to reduce the modulino idea to a single statement, perhaps a
use
statement:use Modulino;I think I’ve got most of the way there with Modulino::Base, which I’ve included in my update to the chapter. It was an interesting journey though. I didn’t want to inherit from it because it’s not really that sort of relationship. I could add it as a role or trait, but I didn’t want to deal with complication surrounding that. I settled on a
require
because the code needs to run after the compile phase when all of the methods are already compiled. That was true of the code that was already controlling that behavior:__PACKAGE__->run(@ARGV) unless caller;Moving all of the code into another file (and using subroutines) messed with
caller
a bit. Now I had to look back a couple of levels to see what was going on. That seems simple now that I’ve figured it out, but on the way I loaded Modulino::Base in many ways and looked at caller
going two levels back to convince myself I was doing the right thing. As with most coding problems, the other weird things I was trying to do had clouded the problems and simplifying the module solved it.
I’ve also expanded the modulino idea. Previously, it was about running as a program or loading as a module. However, we can do other things based on any condition. The module can run as a test script. Modulino::Base looks for methods that start with
_test_
and runs them as subtests if CPANTEST
is set to a true value. I stole that idea from Python, although it doesn’t seem to be as popular as it was when I learned that language. Beyond that, I experimented with having a module file be a template for its own documentation. Using some switch to say I wanted to read the docs, it ran Pod::Perldoc on itself, making modifications to the Pod along the way, such as automatically inserting the right package name. I like that idea and I think there’s more behind it, but it’s not something I want to delay the book for.
You can check out this chapter in O’Reilly Atlas.
No comments:
Post a Comment