3

もつ:

package MyPath;
use strict;
use warnings;
use Moose;

has 'path' => (
    is => 'ro',
    isa => 'Path::Class::Dir',
    required => 1,
);
1;

ただし、次のような 2 つの方法でこのオブジェクトを作成したい:

use strict;
use warnings;
use MyPath;
use Path::Class;
my $o1 = MyPath->new(path => dir('/string/path')); #as Path::Class::Dir
my $o2 = MyPath->new(path => '/string/path'); #as string (dies - on attr type)

そして、'Str' で呼び出す場合- MyPath パッケージの内部で Class::Path::Dir に変換したいので、両方:$o1->path$o2->pathPath::Class::Dir

定義を次のように拡張しようとしたとき:

has 'path' => (
    is => 'ro',
    isa => 'Path::Class::Dir|Str',    #allowing both attr types
    required => 1,
);

それは機能せず、「ある程度」変換する必要がStrありPath::Class::Dirますpackage MyPath...

誰かヒントをくれませんか?

編集:私が見つけたOesorのヒントに基づいて、次のようなものが必要です:

coerce Directory,
    from Str,       via { Path::Class::Dir->new($_) };

has 'path' => (
    is => 'ro',
    isa => 'Directory',
    required => 1,
);

しかし、まだそれを正しく使用する方法がわかりません...

もう少しヒントをください。

4

2 に答える 2