在所有类型上强制使用hashref

时间:2012-10-05 07:24:39

标签: perl moose

我有以下代码重复多次,因为我有几个遵循相同模式的类

use MooseX::Types -declare [ qw( Item ) ];jj
my $itc = $prefix . 'Item';
class_type Item, { class => $itc };
coerce Item, from HashRef, via { load_class( $itc )->new( $_ ) };

我有一种简单的方法可以对创建class_type和强制的代码进行重复数据删除吗?这不是理解MooseX :: Types的问题,而是大量重复代码的问题。这是a link to that code in its current state。它变得有点混乱,并不是我为之骄傲的东西。

1 个答案:

答案 0 :(得分:0)

首先,您的示例代码在语法上不正确。

其次我认为你的问题(如果我理解正确的话)在MooseX::Types文档中直接回答。只需按照那里给出的例子:

package MyTypes;

my @types = qw/Item1 Item2/;

use MooseX::Types -declare => [ @types];

use MooseX::Types::Moose qw/Int HashRef/;
use Moose::Util::TypeConstraints;

use URI;

foreach my $type (@types) {

  class_type $type, { class => 'URI' };
  coerce $type, from 'Str', via { URI->new( $_ ) };
}

1;

package Foo;

use Moose;

has test => (is => 'rw', isa => 'Item1', coerce => 1);

1;

package main;

use v5.10;
use strict;
use warnings;


 my $t = Foo->new(test => 'http://test.com');
 say $t->test;