2012-10-05 40 views
0

我有以下代碼複製好幾次,因爲我有一個遵循相同的模式裹脅在所有類型

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。它變得有點混亂,不是我引以爲豪的。

回答

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; 
+0

修復語法錯誤,但不,我知道如何使他們,問題是我有他們20是完全相同的序列...我試圖減少行數 – xenoterracide

+0

更新代碼創建幾種類型 – jira

+0

由於某種原因我得到這個'警告:字符串找到其中類型預期(你使用= =>而不是一個?)在/ home/libdevel/Business-Cyber​​Source/lib/MooseX/Types/Cyber​​Source.pm第173行.'當我嘗試將它添加到我的類型庫中時,我不確定爲什麼在進一步測試之後不再將名稱導出到本地名稱空間 – xenoterracide