Guys,
I'm still experimenting here, but I had a couple of questions.
ealleniii,
I like your solution; very clever, particularly where you install the
bulder sub as a default instead of a builder, which neatly gets around
the problem that a builder has to be the name of a method of the
class. But the crux of it is here:
> # The real magic:
> $attr = $attr->clone_and_inherit_options(
> default => $builder,
> lazy => 1
> );
> $class->add_attribute($attr);
and my gut instinct is to wonder: doesn't that mean the attribute gets
added to the class twice? Now, admittedly I haven't actually tried it
yet, but it also occurred to me to wonder how you could even _tell_ if
the attribute was installed twice ... could it conceivably generate a
silent failure that just resulted in weirdness down the road? or
something that works today but not tomorrow when Moose guts are
changed?
If the author--or anyone else--has some insight on that issue, I'd
really love to hear it.
Todd,
I'm assuming you replied off-list just because you didn't want the zip
file to land in everyone's inbox, for which I'm sure they're
appreciative. :-) So, after staring at your approach for quite a
while, I finally figured out what's going on: you're actually
_changing_ the default metaclass for everything by applying a new role
to it. Said new role contains this:
> around new_object => sub {
>
> my ($orig_method, $self_aka_class) = (shift, shift);
>
> my $instance = $self_aka_class->$orig_method(@_);
>
> for my $attr ($self_aka_class->get_all_attributes) {
>
> next unless $attr->has_prompt;
>
> unless ($attr->has_value($instance)) {
>
> my $prompted_val = Term::Prompt::prompt('x', $attr->prompt,
> 'help prompt', 'foo');
>
> $attr->set_value($instance, $prompted_val);
> }
> }
>
> return $instance;
> };
Again, very clever. But definitely very different from the approach I
was going for, which was an attribute trait. (Although the provided
test file proves handily that it really works.) Can you--or
anyone--tell me what the practical differences would be between the
two approaches, and why I might prefer one over the other?
Thanx again for the help guys.
-- Buddy