MooseX :: Типы принуждений и $ self - PullRequest
3 голосов
/ 17 декабря 2010

Есть ли способ заставить $self принуждение MooseX::Types? У меня есть другие данные в объекте, которые я хочу использовать, чтобы увеличить свое принуждение от String до Object. В качестве альтернативы, есть ли что-то вроде Class::MOP initializer, которое позволит мне сделать это - ему придется запустить до проверки типов.

Запрошенный псевдокод:

with 'DBHandle';
has 'database' => ( isa => 'Str', is => 'ro', default => 'Db' );
has 'schema' => ( isa => 'Str', is => 'ro', default => 'schema' );
has 'table' => ( isa => 'Str', is => 'ro', default => 'column );

has 'columns' => ( isa => DBCols, is => 'ro', default => sub {[qw/foo bar baz/]} );

Здесь я хочу, чтобы «столбцы» приводились к DBCols - ArrayRef из DBCol (объектов) - требующих использования атрибутов catalog, schema и col, найденных в классе, и с dbh / singleton, предоставленным DBHandle.

Чтобы сделать это менее псевдо, на самом деле ситуация только немного сложнее. Я смог выполнить вышеупомянутое с помощью around, теперь я хочу создать черту атрибута, которая позволила бы этот синтаксис:

has 'column_id' => (
  isa => Int
  , is => 'ro'
  , traits => ['DBKey']
  , default => 5
  , column => 'foo'
);

Если признак атрибута column, предоставленный DBKey, приводит к DBCol так же, как и приведенный выше columns: для этого потребуется возможность доступа к классам database, schema, table, и снова синглтон для dbh.

1 Ответ

5 голосов
/ 17 декабря 2010

Нет.Было бы неплохо, но принуждения действительно были глобальными, и никто еще не написал «контекстно-зависимое принуждение», потому что никто точно не знает, как это сделать.(На самом деле, s / coercions / type constraints / - было бы полезно просто сказать «этот Str должен быть допустимым именем столбца, определенным как запись в columns HashRef этого объекта.)

Люди обычно решают эту проблему с помощью around и / или некоторой комбинации BUILD и BUILDARGS.

...