[jifty-devel] RFC: Design change in ClassLoader

John Peacock jpeacock at rowman.com
Thu Jun 22 15:19:14 EDT 2006


Alex Vandiver wrote:
> Hrm.  I'm afraid I don't really understand what you're saying well
> enough to understand the problem -- I don't doubt that there is
> something wrong, but I just don't understand well enough what it is.
> Can you give a more specific example?

Yes, I think so.  I created the tutorial application MyWeblog and added 
my Login plugin to the etc/config.yml.  I added a new class to Jifty 
itself called Jifty::Plugin::ClassLoader, which is more or less the same 
as the base Jifty::ClassLoader, except that it creates virtual classes 
for MyWeblog as wrappers of Jifty::Plugin::Login, instead of Jifty.

This leads to three @INC entries:

1) one for the Jifty::Plugin::Login class itself (to autogenerate e.g. 
Action classes for J::P::L::Model::User);

2) one for Jifty::Plugin::ClassLoader, which autocreates wrappers for 
MyWeblog using the classes that Jifty::Plugin::Login provides (like 
Login, Logout, and Signup);

3) the conventional Jifty::ClassLoader, which autocreates wrappers for 
MyWeblog using the Jifty classes.

When Jifty goes to generate classes for MyWeblog::Model::User (which is 
inherited from Jifty::Plugin::Login), #2 fires and returns all of the 
correct classes.

However, when Jifty does the same thing for MyWeblog::Model::Post (which 
is a model class that I created in MyWeblog directly), #2 fires then 
returns undef (errors out) trying to provide support for 
Jifty::Plugin::Login::Model::Post (which doesn't exist).  #3 then fires 
and correctly handles all of the classes for MyWeblog::Model::Post out 
of Jifty's own classes.

The problem is that once you are inside Jifty::Util->require(), the only 
possible results are success or failure (error in the log file), even 
though what #2 wants to do is say "never mind me, see if you can resolve 
this class in the next @INC entry."  By making ClassLoader a plugable 
loop, then this isn't an issue.  A single array element can fire (match 
the $module regex) and then pass to the next by just returning undef. 
No errors would be issued, because only a complete failure to match and 
succeed from all of the possible hooks would cause require() to fail.

If Jesse has enabled my access to the repository, I'll create a branch 
tonight and put up what I have so far.  Otherwise, I can generate a diff 
so you can see what I have so far.

John

-- 
John Peacock
Director of Information Research and Technology
Rowman & Littlefield Publishing Group
4501 Forbes Boulevard
Suite H
Lanham, MD  20706
301-459-3366 x.5010
fax 301-429-5748


More information about the jifty-devel mailing list