Thread MooseX::Types - Problem mit Subtype und Where-Test (8 answers)
Opened by roooot at 2010-09-22 22:18

roooot
 2010-09-22 22:18
#141481 #141481
User since
2008-03-03
276 Artikel
BenutzerIn
[default_avatar]
Hallo Leute
ich versuche mir mithilfe von CPAN:MooseX::Types eigene Subtypes für Moose zu bauen.
Sieht eigentlich ganz einfach aus, allerdings schlägt bei mir IMMER der Typentest fehl.

So sieht meine Klasse mit den Subtypen aus:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package PIMYGC::Types::Library;

use MooseX::Types -declare => [
    qw(
      GoogleUrlId
      )
];
use MooseX::Types::Moose qw/HashRef Str/;


subtype GoogleUrlId,
    as      HashRef[Str],
    where   { $_ =~ m/\/([0-9a-z]+)$/xms };

coerce GoogleUrlId, 
    from Str,
    via {
        my ($id) = $_ =~ m/\/([0-9a-z]+)$/xms;
        {
            full    => $_,
            id      => $id,
        }        
    };


Das ganze soll nun aus einem Googlelink der Form
Code: (dl )
http://www.google.com/m8/feeds/contacts/email%40gmail.com/full/6578ac42881547eb
folgendes machen.
Eine GoogleUrlId sieht wie folgt aus:
Ein Hash mit den Schlüsseln Full, welche den kompletten Link oben entählt und ein Schlüssel ID, welcher nur die ID am Schluss enthält. Dem Konstruktur wird allerdings nur der komplette Link als String übergeben.
Mithilfe von coerce geschieht die Umwandlung und mithilfe des Subtypes wird dieser auf Gültigkeit geprüft.
Allerdings schlägt obiges für:

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
   
package PIMYGC::Foo;
use Moose;
#...
use PIMYGC::Types::Library qw /GoogleUrlId/;
    
has 'gcid'      => (
   is          => 'rw',
   isa         => GoogleUrlId,
   required    => 1
);
Code (perl): (dl )
1
2
new PIMYGC::Foo(
   gcid   => 'http://www.google.com/m8/feeds/contacts/email%40gmail.com/full/6578ac42881547eb'

immer mit folgender Fehlermeldung fehl:
Code: (dl )
1
2
Attribute (gcid) does not pass the type constraint because: Validation failed for 'PIMYGC::Types::Library::GoogleUrlId' with value http://www.google.com/m8/feeds/contacts/email%40gmail.com/full/6578ac42881547eb at /var/www/foobar.de/cgi-bin/experiments/googlecontacts/lib/Controller/Test.pm line 47
Controller::Test::load('Controller::Test=HASH(0xc88390)') called at /var/www/foobar.de/cgi-bin/experiments/googlecontacts/core.pl line 51


Kann mir vielleicht jemand auf die Sprünge helfen? Der Regex im where stimmt und würde auch das richtige extrahieren.

Danke für Hilfe.
Viele Grüße :)

View full thread MooseX::Types - Problem mit Subtype und Where-Test