----- Original Message -----
From: Yuval Kogman <[EMAIL PROTECTED]>
Sent: Thu, 24 Jul 2008 23:27:11 +0300
Re: Re: Coercions and custom type parameters

Declaring an attribute with a parameterized type:

        has foo => (
                isa => "ArrayRef[Foo]",
                coerce => 1,
        );

has a specific behavior right now, it enables only the coercions on
the type "ArrayRef[Foo]".



OK, I hadn't thought about it that way. So, I can declare a subtype that looks parametrized, but it really isn't.

subtype 'ArrayRef[Int]' => as 'Str' => where { 1 };



Custom parametrized types could still make sense though:

        MyCustomType[Foo]

is a useful construct for custom container types, for functors, etc
etc, so deep_coerce *is* a useful property to have


Wow, I didn't know that was possible either. You guys have thought of everything...

So, this is my custom collection, which is parameterizable:

  subtype 'BigArrayRef' => as 'ArrayRef' => where { scalar(@$_) > 1 };

  has 'my_big_arrayref' => ( is => 'rw', isa => 'BigArrayRef[Int]' );


Now, I can also create a pseudo parameterizable subtype, that does something like this:

  subtype 'BigArrayRef[Int] => as 'ArrayRef' => where {
      my $ar = $_;
      return unless scalar( @$ar ) > 1;
      for ( @$ar ) {
        return unless m/^ \d+ $/x;
      }
      return 1;
  }

Well what does this mean now:

has 'my_new_big_arrayref' => ( is => 'rw', isa => 'BigArrayRef[Int][Int]' );

I think I've just confused myself. I'm going to sit down and play with this some more...

Thanks,
Charles Alderman



Reply via email to