2016-09-16 2 views
2

私たちはPerl Mooを使用しています。私はいくつかの属性のために多分[T]でTを置換するルーチンを書きたい属性タイプを変更するにはどうすればよいですか? (Perl Moo)

package C; 
use Moo; 
use Types::Standard qw(Str Int Num Maybe); 

has 'x' => (is=>'rw', isa=>Str); 
has 'y' => (is=>'rw', isa=>Int); 
has 'z' => (is=>'rw', isa=>Int); 

# here to insert make_optional() described below 

1; 

は、一連の属性が定義されてみましょう。たとえば、make_optional(qw(x y))は、タイプがxMaybe[Str]で、種類がyMaybe[Int]である必要があります。

ムーさんとのやり方は?

+2

あなたが持っていた多くの質問と同じように、私は自分自身に質問しています。**なぜ**ですか? – simbabque

+0

@simbabque私たちは、軽量で機能豊富なORM(DBI + SQLより上のレベル)をいくつか持っています。今私は "ビジネスオブジェクト"(ORMより上のレベル)を作ることができます。ビジネスオブジェクトのタイプ(および 'has'ステートメント)の中には、DB列情報から自動的に生成されるものがあります。しかし、私は 'undef'値(NULL列と同じではない)(' Maybe'型)を取ることができる列のリストを手作業で指定し、それを簡単な方法で行う必要があります。 – porton

+0

DBICのようにテーブルレイアウトが変わるたびにコードジェネレータを書いて実行することはできませんか? – simbabque

答えて

4

できません。

Moo does not have a Meta Object Protocol。それがなければ、戻って物を変えることはできません。

メタオブジェクトはありません。このレベルの複雑さが必要な場合は、明示的にメタプロトコルを提供しないため、Moose-Mooは小さくなければなりません。

さらに、タイプは単なるコードのリファレンスです。

組み込み型システムはありません。 isaはコードリーダで検証されます。複雑な型が必要な場合、Type :: Tinyは型や型ライブラリを提供し、MooとMooseの両方とシームレスに動作します。あなたはどうする可能性が多分それはMaybe[Str]Strように振る舞うかどうかを判断するためにどこか他のシングルトンのいくつかの種類にアクセスタイプを記述し、それはロングショット、おそらく醜いとクレイジーだとあなたは「shouldnさ


それをしないでください。

+0

しかし、私はcoderef 'c'を取得し、' Maybe [c] 'で置き換えることができるようです。問題は、与えられた属性の型coderefを取得する場所です。 – porton

+1

@porton新しい質問かもしれません。または#に行くようにしてください。彼らはあなたからそれを話そうとしますが、彼らは助けます。 – simbabque

関連する問題