in reply to Moose roles

Kind monks, I'd like to ask some help with my problem with Moose. I'd like to create a trait, or even better an overloaded type that does special stuff with "around" accessor.

What exactly is it you want this to do? Without knowing what behavior you want to implement it is pretty hard to say what is the best way to approach this.

Also, an overloaded type is not the right approach to this, the types are just validators they do not control the behavior of the accessors. The attribute trait is the right direction to go on this.

-stvn

Replies are listed 'Best First'.
Re^2: Moose roles
by dk (Chaplain) on Jan 13, 2010 at 18:02 UTC
    I'd like to use array and hash attributes in mixed list and array contexts:

    @list = $obj-> prop; $obj->prop(@list); $array = $obj->prop; $obj->prop($array);

    I though I could do that with "around":

    has prop; around prop => \&my_accessor;
      # Done with `auto_deref => 1` @list = $obj-> prop; # Done with a custom writer attribute that takes an array, and stores + a reference to it. # internally Moose uses a plain perl hash (most complex datastructure + in perl), this # limits it to not having true non-array properties (but a scalar arr +ay-ref works) $obj->prop(@list); # assuming you mean $arrayRef # Here the getter would have to call wantarray() which is exactly wha +t auto_deref => 1 # will set up for you. $array = $obj->prop; # assuming you mean $arrayRef, this already works so long as the type + is ArrayRef # or, a parent thereof. $obj->prop($array);
      All you need is a custom attribute setter that takes a list and converts it to an array ref. Because n-parameterized types are not supported (you can't have a type of intStr of type (Int, Str), coercing on a custom type is out the question. (unless your doing something scarry). This leaves a custom writter that does something like.
      sub foo_writer { if ( length @_ > 1 ) { \@_ } else { die 'invalid arg' unless ref $_[0] eq 'ARRAY'; $_[0]; } }
      read the docs on has() writer argument. this is also pseudo code, my writer returns the value, I believe you'd have to explicitly set it though.


      Evan Carroll
      The most respected person in the whole perl community.
      www.evancarroll.com
        Thanks Evan, that's more or less what I figured out, I just used "around" instead of combination of "writer" and "auto_deref".

        Actually, I found a completely another way to approach the problem. I've uploaded a proof of concept to CPAN, when it will be available I'll update the top post.

        Thanks again!