Stories
Slash Boxes
Comments
NOTE: use Perl; is on undef hiatus. You can read content, but you can't post it. More info will be forthcoming forthcomingly.

All the Perl that's Practical to Extract and Report

The Fine Print: The following comments are owned by whoever posted them. We are not responsible for them in any way.
 Full
 Abbreviated
 Hidden
More | Login | Reply
Loading... please wait.
  • That is a warning message generated by Test::MockObject (chromatic) about DateTime::Locale because when things fail weirdly, chromatic was sick of receiving bogus error reports and complaints about Test::MockObject when it was really the fault of the person using UNIVERSAL::can/isa as a function (which they shouldn't be).

    DateTime::Locale needs to call stuff as a method, not a function.
    • Err, take a look at that line:

      unless ( $real_class->can('new') )
      What exactly is wrong with that?
      • A shot in the dark, but is $real_class loaded when you make that call?

        Compare:

        $ foo->isa('UNIVERSAL') and print "yes\n"
        <nothing>

        to

        $ package foo;
        $ foo->isa('UNIVERSAL') and print "yes\n"
        yes

        I think U::can might get upset in this case... but who knows.

        Another possibility... didn't that line use can as a function in an older version of the module?  I can't get the warning to happen with the latest DateTime::Locale, but I could about a year ago.
        • Sorry, an addendum:

          $ use UNIVERSAL::can;
          $ UNIVERSAL->can('can') and print "can can\n";
          can can
          $ FOOBAR->can('can') or print "cannot can\n";
          Called UNIVERSAL::can() as a function, not a method at (eval 59) line 5
          cannot can
          $ package FOOBAR;
          $ FOOBAR->can('can') and print "now can can\n";
          now can can

          • Yep, that's the issue. In fact, the use of can is a way to check if the module has been loaded. It's quicker than blindly using require in every case, I think.
            • You are relying on undocumented internal behaviour. At the very least I can find no documentation that a class that has not been fully defined yet does not have the methods that all classes should have. In fact I would prefer it if Perl had the opposite behaviour. What will you do if that behaviour changes someday?

              Furthermore pity the poor programmer who has to figure out your code. Do you always put comments on your uses of that idiom? If not, then will it make sense to someone else that you're checking whether something can can when it should always be able to can? It wouldn't to me!

              It is far safer to write a function to do your test. That function can either check %INC directly or can walk the symbol table. (Walking the symbol table is closer to what calling the can method is.) Then you can just write is_loaded("class") and your code is more self-documenting, and is less likely to break in a future version of Perl.
              • D'oh! You aren't relying on undocumented internal behaviour. You're checking for whether the class can call new, not whether it can call can!

                I'll just go hide in a corner then.