2014-02-13 5 views
0

У меня есть простой тестовый класс, использующий Moose с атрибутом XML :: LibXML :: Document, но получаю сообщение об ошибке при использовании этого тестового класса. Класс тест:Ошибка делегированияToAClassWhichIsNotLoaded с Moose и XML :: LibXML

package moosetest; 

use strict; 
use warnings; 

use XML::LibXML; 

use Moose; 

has dom => (is => 'rw', isa => 'XML::LibXML::Document', required => 0, handles => qr/^(findnodes | documentElement | setDocumentElement | toString | toFile)$/x); 


1; 

Затем он используется в test.pl:

use XML::LibXML; 

use moosetest; 

my $tt = moosetest->new(); 

И когда я бегу test.pl, я получаю сообщение об ошибке:

Атрибут дом пытается для делегирования в класс, который не был загружен - XML ​​:: LibXML :: Document

Я использую perlbrew, XML :: LibXML установлен (я могу создать экземпляр объекта XML :: LibXML :: Document без usi ng Moose), Moose также был успешно установлен.

Похоже, я пропускаю что-то важное здесь, но я не могу найти источник моей проблемы ...

Спасибо за любую помощь.

Francois.

ответ

1

Moose::Meta::Attribute::_find_delegate_metaclass использует Moose::Util::_is_package_loaded, который ищет XML::LibXML::Document в @INC. Однако пакет XML::LibXML::Document находится внутри XML/LibXML.pm.

Использование массива вместо регулярного выражения для ручек позволяет избежать этой проблемы:

handles => [ qw(findnodes documentElement setDocumentElement toString toFile) ], 
+0

ОК, она работает с изменением вы предложили. Все еще странно для меня ... Я исправлю код, но он работал с предыдущей версией perl (5.16), XML :: LibXML и Moose, возникла ошибка, когда я попытался обновить среду разработки ... – francois

+0

ОК, отвечая самому себе: он работал с Moose 2.0802 и не справляется с последней версией. Может быть, из-за изменения в 2.1100 (изменил загрузчик классов) ... – francois

Смежные вопросы