Если вы хотите по умолчанию использовать File :: Spec :: Unix в общем и конкретно использовать File :: Spec :: Win32, вы не хотите использовать множественное наследование. File :: Spec :: Unix уже наследуется от File :: Spec :: Win32, поэтому вы установили (в основном) наследование алмазов, которое C3 не хочет разрешать.
Unix
/ \
Win32 |
| |
YourCode
Вы просто хотите наследовать от File :: Spec :: Unix, а затем использовать File :: Spec :: Win32 по желанию.
package My::FileSpec;
use parent qw(File::Spec::Unix);
require File::Spec::Win32;
sub devnull {
my $class = shift;
return $class->File::Spec::Win32(@_);
}
Если вы хотите стать умным, вы можете исключить метод обертки.
*devnull = File::Spec::Win32->can("devnull");
Наконец, вы можете поместить это в цикл, чтобы избежать повторения.
my @Win32_Methods = qw(devnull tmpdir);
for my $method (@Win32_Methods) {
my $code = File::Spec::Win32->can($method);
die "File::Spec::Win32->$method does not exist" unless $code;
no strict 'refs';
*{$method} = $code;
}
Вы можете переопределить isa
, чтобы утверждать, что вы File :: Spec :: Win32, а также File :: Spec :: Unix, но это не совсем так, и, вероятно, будет более запутанным, чем полезным только для вашего класса действует как Win32 для нескольких методов. Кроме того, File :: Spec не имеет объекта, поэтому он практически не появится.
Переопределение can
необязательно, оно вернет правильные ссылки на код.