BUILDARGSを呼び出すときに、MooseX::Declareを正しく使用できません。
ファイルのインターフェイスとしてオブジェクトを作成しようとしています。(具体的には、ファイル内の次の数バイトを確認し、さらに処理するためにそれらを切り落とすことができるバイナリファイルへのインターフェイスが必要です。)
このようなオブジェクトの1つを作成できるようにしたい
my $f = binary_file_buffer->new( $file_name );
そして、このように使用します
while( my $block_id = $f->peek( $id_offset, $id_length ) ) {
$block_id = unpack_block_id( $block_id );
$munge_block{ $block_id }->(
$f->pop( $block_size[ $block_id ] )
);
}
私のbinary_file_bufferクラスの定義/宣言は次のようになります
use MooseX::Declare;
class binary_file_buffer {
use FileHandle;
use Carp;
has _file => ( is => 'ro', isa => 'FileHandle' );
has _file_name => ( is => 'ro', isa => 'Str' );
has _buff => ( is => 'rw', isa => 'Str', default => '' );
method BUILDARGS ( Str $file_name ) {
my $file = FileHandle->new( $file_name );
carp "unable to open $file_name : $!" unless defined $file;
$file->binmode;
return (
_file_name => $file_name,
_file => $file,
);
}
# get the next n bytes from the buffer.
method pop ( Int $len ) {
# ... Make sure there is data in _buff
return substr( $self->{_buff}, 0, $len, '' );
}
# Look around inside the buffer without changing the location for pop
method peek ( Int $offset, Int $len ) {
# ... Make sure there is data in _buff
return substr( $self->{_buff}, $offset, $len );
}
}
(ここに含めなかったコードのバッファーのロードと管理があります。これはかなり簡単です。)
method
問題は、BUILDARGS
宣言でキーワードを使用していることです。したがって、MooseX :: Declareは、の最初の引数としてbinary_file_buffer
オブジェクトBUILDARGS
を想定しています。ただしBUILDARGS
、引数はnewに渡されるため、最初の引数は文字列a'binary_file_buffer'
であり、パッケージの名前です。その結果、最初のコードスニペットで行ったように、newを使用してオブジェクトを作成すると、型チェックに失敗して終了します。(少なくとも、それが何が起こっているのかについての私の理解です。)
私が受け取るエラーメッセージは次のとおりです。
Validation failed for 'MooseX::Types::Structured::Tuple[MooseX::Types::Structured::Tuple[Object,Str,Bool],MooseX::Types::Structured::Dict[]]' failed with value [ [ "binary_file_buffer", "drap_iono_t1.log", 0 ], { } ], Internal Validation Error is: Validation failed for 'MooseX::Types::Structured::Tuple[Object,Str,Bool]' failed with value [ "binary_file_buffer", "drap_iono_t1.log", 0 ] at C:/bin/perl/site/lib/MooseX/Method/Signatures/Meta/Method.pm line 445
MooseX::Method::Signatures::Meta::Method::validate('MooseX::Method::Signatures::Meta::Method=HASH(0x2a623b4)', 'ARRAY(0x2a62764)') called at C:/bin/perl/site/lib/MooseX/Method/Signatures/Meta/Method.pm line 145
binary_file_buffer::BUILDARGS('binary_file_buffer', 'drap_iono_t1.log') called at generated method (unknown origin) line 5
binary_file_buffer::new('binary_file_buffer', 'drap_iono_t1.log') called at logshred.pl line 13
キーワードが$file_nameに提供する型チェックシュガーが好きですが、技術的にはメソッドではないmethod
ため、取得方法がわかりません。BUILDARGS
MooseX :: Declareには、$self
作成をスキップする方法などがありますか?
私はこれを適切なMooseX::Declareの方法で行っていますか?それとも私は何かが足りないのですか?