How do you code a subtype definition that forces a coercion to be used?

I have:

package My::Types;

use MooseX::Types -declare => [ qw( A chA nochA ) ];

sub _valid_A {
    my $val = shift;
    $val =~ /^(?:chr)A/
}

subtype A,
    as Str,
    where { _valid_A($_) };

subtype chrA;
coerce chrA, from A, via { s/^(?!chr)/chr/; $_ };

subtype nochA;
coerce nochrA, from A, via { s/^chr//; $_ };

Written that way, I get it dying:

MooseX::Types::TypeDecorator::AUTOLOAD(): Method 'create_child_type' is not 
supported for ...

If I change the target subtypes to have an "as Str" clause, it no longer dies 
but it accepts any string without appliying the coercion.  The same happens if 
I use "as A".

So, how do I specify a type that starts with a base type, but then applies a 
coercion?  All the examples I see of coercions have a "natural" base encoding, 
with the coercion providing a way to take some other type of value and turn it 
into the base - but when base is a validated string, it is hard to get it to 
actually use the coercion.



John Macdonald
Software Engineer

Ontario Institute for Cancer Research
MaRS Centre

661 University Avenue

Suite 510
Toronto, Ontario

Canada M5G 0A3


Tel:

Email: [email protected]

Toll-free: 1-866-678-6427
Twitter: @OICR_news


www.oicr.on.ca<http://www.oicr.on.ca/>

This message and any attachments may contain confidential and/or privileged 
information for the sole use of the intended recipient. Any review or 
distribution by anyone other than the person for whom it was originally 
intended is strictly prohibited. If you have received this message in error, 
please contact the sender and delete all copies. Opinions, conclusions or other 
information contained in this message may not be that of the organization.

Reply via email to