もつ:
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->path
Path::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,
);
しかし、まだそれを正しく使用する方法がわかりません...
もう少しヒントをください。