eval {require XML::LibXML}を失敗させたい

Nobuo Danjou
2009-08-31T04:05:38+0900
  • 動機
    • XML::AtomはXML::LibXMLが使えないときにXML::XPathを使ってパースしてくれるんだけど、XML::XPathの時の挙動を調べたい。
  • やってみた
    • XML::AtomのBEGINブロックでeval{ require XML::LibXML }してチェックしてる
    • どこかでXML::LibXMLを殺せばいいんだけどどこに割り込めばいいのか分からない
  • #soozyで教えてもらった。
    • gfx: sub XML::LibXML::bootstrap{ die } require XML::Atom; でどうでしょう。
      • おおおお!
    • gfx: でもXML::LibXMLがXSLoader使うようになったらまた別の手を使わないとだめですよ。
      • この場合うまくいくけど、汎用性がない、ということですね。
    • lestrrat: @INCに sub { die if $_[0] eq 'XML::LibXML' } 的なものをしこんでおくのは?
  • ということで、下のスクリプトを動かすとXML::XPathで動いていることが分かる。
use strict;
use warnings;
use Test::More;

BEGIN {
    unshift @INC, sub {die if $_[1] eq 'XML/LibXML.pm'; return};
}

use XML::Atom::Entry;

my $xml = <<END;
<?xml version='1.0' encoding='utf-8'?>
<entry xmlns='http://www.w3c.org/2005/Atom'
    xmlns:gd='http://schemas.google.com/g/2005'
    gd:etag='"hoge"'>
</entry>
END

{
    my $atom = XML::Atom::Entry->new(\$xml);
    isa_ok $atom->elem, 'XML::XPath::Node::Element';
#    my $etag = $atom->elem->getAttributeNS('http://schemas.google.com/g/2005', 'etag');
    my $etag = $atom->elem->getAttribute('gd:etag');
    is $etag, '"hoge"';
}

done_testing;

#soozyのみなさん、ありがとうございました!