我想要实现的是创建一个导入多个角色的Moose类.这是我多年来一直在做的事情没有问题,但我目前仍然坚持为什么下面的简单示例会产生方法名称冲突.
package logrole; use Moose::Role; use POSIX; use namespace::autoclean; package otherrole; use Moose::Role; use File::Temp; use namespace::autoclean; package myclass; use Moose; use namespace::autoclean; with 'logrole','otherrole'; package main; use strict; use warnings; use myclass;
运行这个给出:
Due to method name conflicts in roles 'logrole' and 'otherrole',the methods 'SEEK_CUR','SEEK_END',and 'SEEK_SET' must be implemented or excluded by 'myclass' at /home/user/perl5/perlbrew/perls/perl-5.22.1/lib/site_perl/5.22.1/x86_64-linux/Moose/Exporter.pm line 419 Moose::with('logrole','otherrole') called at roles.pl line 29
package logrole; use Moose::Role; use POSIX; use namespace::autoclean; package otherrole; use Moose::Role; use File::Temp; use namespace::autoclean; package myclass; use Moose; use namespace::autoclean; with 'logrole','otherrole' => { -excludes => ["SEEK_CUR","SEEK_END","SEEK_SET" ] }; package main; use strict; use warnings; use myclass;
这解决了名称冲突,但是这个解决方案的问题是尝试在otherrole中导入POSIX会产生数百个名称冲突,因此在模块myclass中排除所有这些的修复似乎非常混乱.
解决方法
namespace::autoclean不会删除方法,它信任
Class::MOP::Class的get_method_list来返回它们.令人困惑的是,它返回POSIX模块中的所有常量.
如果将namespace :: autoclean切换到namespace::clean,则问题就消失了.