3

Mooseベースのオブジェクトをインスタンス化できるようにしたいのですが、シリアル化してから変更できないようにしたいのです。どうすればこれを行うことができますか?

4

2 に答える 2

1

2 つのクラスと共通の Role を作成します。

package Thing
use Moose::Role;

has some_attrib => (isa => 'AnotherThing');

### Behaviour (the important stuff) goes here

package ImmutableThing;
use Moose;

with 'Thing';

has +some_attrib => (is => 'ro');

sub finalize { shift }

package MutableThing
use Moose;

with 'Thing';

has +some_attrib => (is => 'rw');

sub finalize {
    my $self = shift;
    Thing->new({some_attrib => $self->some_attrib});
}

ただし、同じクラスの可変フォームと不変フォームを持つことが必ずしも良い考えかどうかはわかりません。私は、ビルド時間と操作時間を、異なるインターフェイスを持つ 2 つの異なるフェーズとして考えようとする傾向があります。

モノを作成するために必要な情報を収集するために最適化されたインターフェースを備えたパラメーターコレクター (パターンのように大文字にしましたが、文献では見たことがありません) を作成する傾向があります。プログラムの残りの部分で使用されるオブジェクトです。

于 2012-06-04T10:16:34.950 に答える
0

CPANでこれを行うためのモジュールを知りません(そして簡単に見つけることができません)。これは驚くべきことですが、あなたが求めている理由を説明しています:-)

すべての属性に対する「前」の修飾子は、それを行うための明白な方法です。すべての属性アクセサーのリストを取得して修飾子を適用するための適切なメタプログラミングの方法があると確信していますが、それらすべてを大きなコメントで明示的にリストしたくなるでしょう。

ここに 1 つまたは 2 つのクラス (Thingy、LockedThingy) があるかどうかを検討しましたか? 2 つのクラスを使用すると、メタの賢さをカプセル化できます。

于 2012-05-28T06:20:08.210 に答える