Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^5: Moose and default values

by morgon (Deacon)
on Feb 20, 2013 at 22:42 UTC ( #1019858=note: print w/ replies, xml ) Need Help??


in reply to Re^4: Moose and default values
in thread Moose and default values

It's nice (and only 10 lines of code :-=).

But say I now wanted not only undefs but everything that is false (e.g. also an empty string) to trigger the default?

Does Moose not have any mechanics for that?


Comment on Re^5: Moose and default values
Re^6: Moose and default values
by tobyink (Abbot) on Feb 20, 2013 at 22:54 UTC

    Maybe something along the lines of:

    around BUILDARGS => sub { my $orig = shift; my $self = shift; my $params = $self->$orig(@_); $params->{$_} || delete $params->{$_} for qw/ foo bar /; return $params; };

    This will discard false parameters for the "foo" and "bar" attributes.

    package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
      Sure you can always hack togther something, I was more looking for a way to do such things declaratively...

      But your Haskell-ripoff is a at least a step forward - thanks.

        With enough hacking you can make anything look declarative!

        use v5.14; use strict; use warnings; # Ugly hack code # package MooseX::AttributeShouldIgnoreFalse { BEGIN { $INC{'MooseX/AttributeShouldIgnoreFalse.pm'} = __FILE__ }; use Sub::Exporter -setup => { exports => ['attribute_should_ignore_false'], groups => { default => ['attribute_should_ignore_false'], }, }; sub attribute_should_ignore_false { my @attrs = @_; my $meta = (scalar caller)->meta; $meta->add_around_method_modifier(BUILDARGS => sub { my $orig = shift; my $self = shift; my $parm = $self->$orig(@_); $parm->{$_} || delete $parm->{$_} for @attrs; $parm; }); } } # Lovely declarative code # package Foo { use Moose; use MooseX::AttributeShouldIgnoreFalse; has foo => (is => 'ro', default => 'whatever'); attribute_should_ignore_false 'foo'; } my $value = 'hello'; print Foo->new(foo => $value)->dump; $value = ''; print Foo->new(foo => $value)->dump;
        package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1019858]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others avoiding work at the Monastery: (9)
As of 2014-12-18 07:41 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    Is guessing a good strategy for surviving in the IT business?





    Results (44 votes), past polls