You also have all the options passed in creation.  As long as you are not
using attribute override (has +), you have what you need, I think?
Something like this:

before _process_options => sub {
    my ($class, $name,$options) = @_;
    $options->{default} = sub {
           my $resp;
           my $type;
           if ($options->{isa}) {
                   $type =
Moose::Util::TypeConstraint::find_or_parse_type_constraint($options->{isa});
           }
           while (! defined $resp) {
              $resp = get_input_from_lazy_user($name);
              if ($type) {
                   if ($type->has_coercion) {
                           $resp = $type->coerce($resp);
                   }
                   if (! $type->check($resp) {
                           $resp = undef;
                   }
            }
            return $resp;
     };
}

If you are using attribute overrides, etc, then look at the code I
submitted originally.


On Thu, Dec 22, 2011 at 6:21 PM, Buddy Burden <barefootco...@gmail.com>wrote:

> On Thu, Dec 22, 2011 at 3:51 PM, Edward Allen <edw...@allenthree.com>
> wrote:
> > As long as you document what you are doing so that the poor sap who has
> to
> > maintain your code after you win the lottery can figure it out, I say go
> for
> > it!  Wrapping _process_options is time honored, convenient, and an
> absolute
> > must technique for any mooser, imho.
>
> Thanks for the encouragement guys!  Okay, one more question ...
>
> Since I'm wrapping _process_options, I'm being called from new() ...
> that is, the new() for the attribute itself.  I.e. the attribute
> doesn't really exist yet, as it's in the process of being created.
> Which I normally wouldn't care about, but I got to the point where I
> want my prompting routine to verify that the user-supplied value will
> pass the type constraint when assigned to the instance's attribute
> slot.  If I _don't_ do this, the program will just blow up.  What I'd
> rather it do is validate the value using the attribute's type
> constraint, then just reprompt upon failure.  But the attribute
> doesn't exist at the time I create the prompting routine, so I _have_
> no type constraint to use for checking.  All I have is the name of the
> attribute,(*) which I keep thinking I should be able to leverage
> somehow, but I have neither the classname the attribute belongs
> to--which probably wouldn't be sufficient anyway--nor an instance
> pointer, which of course doesn't even exist at the time I'm executing.
>  (Man, this keeping straight all the various levels and times things
> are running at is the hardest part of this Moose stuff ...)  And,
> since I'm creating a default sub, the actual assignment is happening
> elsewhere too, so I can't even wrap that in a try block to catch the
> type constraint error.
>
> So, anyway: ideas?  I'm going to keep plugging away, but I thought I'd
> ask here as well.
>
>
>             -- Buddy
>
>
> (*) Technically, this is not true.  Technically, I have access to the
> raw 'isa' of the attribute as well.  But trying to turn that into a
> type constraint seems ... hacky.  And error-prone.  And inefficient,
> since the Moose code is just going to do it again anyway.
>

Reply via email to