On Tue, Sep 22, 2009 at 08:43:08PM -0500, Jesse Luehrs wrote:
> On Tue, Sep 22, 2009 at 06:16:48PM -0700, Darren Duncan wrote:
> > 1. I looked for the implementation of is_class_loaded() and it seems the
> > only implementation is XS, in the file MOP.xs, with no Pure Perl version
> > existing, although the code comments with that XS says there is a Pure
> > Perl version in lib/Class/MOP.pm which one should study to better
> > understand the "grotty logic". Now I interpret this as that the code
> > comment is outdated and the Pure Perl version was removed sometime around
> > when it was decided to make a C compiler a mandatory requirement of using
> > CMOP. If I'm wrong, please point out the Pure Perl version, or else the
> > comment needs updating.
>
> Yeah, that comment is outdated, for the reasons you mentioned.
Fixed.
> > 2. From lib/Class/MOP.pm:
> >
> > sub _try_load_one_class {
> > my $class = shift;
> > return if is_class_loaded($class);
> > my $file = _class_to_pmfile($class);
> > return do {
> > local $@;
> > local $SIG{__DIE__};
> > eval { require($file) };
> > $@;
> > };
> > }
> >
> > One thing that I'm doing which CMOP doesn't seem to do is test after an
> > error-free eval that the successfully compiled module actually declares a
> > class of the requested name. For example, by adding another
> > is_class_loaded() call after the "eval" line iff $@ doesn't hold an
> > error. So the way CMOP is now, load_class() seems to return true if it
> > compiles the appropriately named file, and regardless of whether the
> > desired class was declared by it.
> >
> > That seems to be an error to me. Would you agree or disagree?
>
> Not sure about this one... it sounds reasonable, but don't know if other
> code might be relying on this?
>
> > 3. I seem to recall reading somewhere, maybe in the Try::Tiny docs, that
> > it is a common error to test $@ for truthiness rather than definedness.
> > CMOP is just testing for truthiness, which would I think fail if someone
> > throws an exception consisting of the number zero or the empty string.
> >
> > So that also seems to be an error in CMOP. Agree/disagree?
> >
> > P.S. Yes, I recognize my own code also has some of the same mistakes of
> > #3, and I'll fix them.
>
> Yeah, there are probably a bunch of places that we should be using
> Try::Tiny rather than eval... this does look to be one of them.
I've got a branch which converts all uses of block-eval in Class-MOP and
Moose to use Try::Tiny instead, that should fix this issue.
-doy