2009-02-24 10 views
8

私は現在、 "Moose"パッケージを使用してPerl OOPを開始しています。Mooseでオプションのパラメータを処理するにはどうすればよいですか?

コンパイラは、 "Parser.pm 16行目の非左辺サブルーチンコールを変更できません"

なぜ新しいオブジェクトを割り当てることができないのかよくわかりません。私は、Mooseでオプションのパラメータを実行するための、より有効な、あるいはより有効な方法があると思いますか?

#!/usr/bin/perl -w 

package Parser; 

use Moose; 

require URLSpan; 

require WWW::Mechanize; 

has 'urlspan' => (is => 'rw', isa => 'URLSpan', required => 1); 
has 'mech' => (is => 'rw', isa => 'WWW::Mechanize'); 

sub BUILD { 
    my $self = shift; 
    if(!$self->mech) { 
     warn("no Mech set for " . $self->urlspan->name); 
     $self->mech = WWW::Mechanize->new(agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6) Gecko/2009011913 Firefox/3.0.4', 
             stack_depth => 1 
             ); #line 16 
     } 

} 
+1

オプションのパラメータとの接続はありません。それを拡大できますか? – ysth

答えて

13

$self->mechはメソッドコールです。実際にはCの構造体のフィールドのように扱うことはできません。設定したい場合は、新しいオブジェクトを渡す必要があります。

 $self->mech( 
      WWW::Mechanize->new(
       agent => 'xyz', 
       stack_depth => 1 
      ) 
     ); 
5

Perlが使用する機能を提供してきたが、あなたは(左辺値潜水艦と呼ばれているものを介して)良い長年にわたってしようとしている道を属性、それは最初のOO Perlのリリース、そして人にあったものではないのですそれなしでやることをかなり学んだ。特にバリデーションを実装するのは少し難しい(そして非効率的である)からです。

MooseX::Meta::Attribute::Lvalueを使用することもできますが、(文書に従って)いくつかの属性についてタイプチェックを行わないという代償を払ってください。

$ self->属性( "value")スタイルを使用することをおすすめします。

+0

このモジュールは使用しないでください。設計通りに壊れています。 –

+0

@Dave Rolsky:私が留意したように、あるいは何か他の方法で? – ysth

6

おそらくこれを行うための好適なムースの方法は属性にlazy_build設定することです:

has 'mech' => (is => 'rw', isa => 'WWW::Mechanize', lazy_build => 1); 
sub _build_mech { 
    warn("no Mech set for " . $self->urlspan->name); 
    WWW::Mechanize->new(
      agent => 'Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.9.0.6)'. 
        ' Gecko/2009011913 Firefox/3.0.4', 
      stack_depth => 1 
    ); 
} 

これは、そうで設定されていない限り、属性メック」は、それが初めて呼び出されたときに読み込まれますすることができますコンストラクタまたはアクセッサ(これはまだ 'rw'なので)によって呼び出されます。

+0

この質問とあなたの説明に戻ってくれてありがとう! –

関連する問題