[Melbourne-pm] Moose 'isa' property prevents setting attribute to undef

Ian Macdonald ickphum at gmail.com
Sun Sep 16 21:39:43 PDT 2012


Thanks to David and Stephen for their prompt and informative replies, much
appreciated.

On Mon, Sep 17, 2012 at 2:05 PM, Stephen Thirlwall <
stephen.thirlwall at strategicdata.com.au> wrote:

> The easiest way to do what you want is:
>
>         isa => 'Maybe[AG::Dataset]'
> or
>         isa => 'Undef|AG::Dataset'
>
> Then undef is also an accepted value for dataset.
> (no idea which is the preferred syntax)
>
>
> David's suggestion has the benefit/drawback of preventing dataset
> from being inadvertently set to undef.
>
>         $foo->dataset($value_is_undef)
>
>
> There is also:
>
>         predicate => 'has_dataset'
>
> which does what is says.
>
>
> It also makes sense to use both the clearer/predicate and nullable type,
> in the (rare?) case where you need to distinguish unset from set-to-undef.
>
> eg.
>
> my $foo = Foo->new;     # $foo->has_dataset is false
> $foo->dataset($x);      # $foo->has_dataset is true
> $foo->dataset(undef);   # $foo->has_dataset is still true
> $foo->clear_dataset;    # $foo->has_dataset is false again
>
>
> Steve
>
>
>
> On 17/09/12 1:19 PM, David Warring wrote:
>
>> Hi Ian,
>> You most likely want to delete the attribute entirely, rather than
>> setting it to undef.
>>
>> One way is to define a clearer property for it:
>>
>> package Foo;
>>
>> use Moose;
>>
>> # ...
>>
>> has 'dataset' => (
>>      is => 'rw',
>>      isa => 'AG::Dataset',
>>      required => 0,
>>      clearer => 'clear_dataset',
>> );
>>
>> then ...
>>
>> my $foo = Foo->new();
>> $foo->dataset(bless {}, 'AG::Dataset');
>>
>> use YAML::Syck; print YAML::Syck::Dump({foo => $foo});
>>
>> $foo->clear_dataset;
>>
>> use YAML::Syck; print YAML::Syck::Dump({foo => $foo});
>>
>> - David
>>
>> On Mon, Sep 17, 2012 at 12:52 PM, Ian Macdonald <ickphum at gmail.com<mailto:
>> ickphum at gmail.com>> wrote:
>>
>>     Hi,
>>
>>     We've got a Moose class with this attribute:
>>
>>
>>     has 'dataset' => (
>>          is => 'rw',
>>          isa => 'AG::Dataset',
>>          required => 0,
>>     );
>>
>>     It's not required so you can happily create objects without supplying
>> a value for it, but once you've done so, you can't then remove/clear it via
>> "$object->dataset(undef)" :
>>
>>          Attribute (dataset) does not pass the type constraint because:
>> Validation failed for 'AG::Dataset' failed with value undef (not isa
>> AG::Dataset)
>>
>>     Given that it's legal to have undefs in there initially it seems
>> funny not to be allowed to revert to that state. Am I missing another
>> property which will allow this? I'd rather not have to remove the
>> validation or do it manually, seems like a backward step.
>>
>>     Thanks,
>>     --
>>     Ian Macdonald
>>
>>
>>     ______________________________**_________________
>>     Melbourne-pm mailing list
>>     Melbourne-pm at pm.org <mailto:Melbourne-pm at pm.org>
>>     http://mail.pm.org/mailman/**listinfo/melbourne-pm<http://mail.pm.org/mailman/listinfo/melbourne-pm>
>>
>>
>>
>>
>>
>> ______________________________**_________________
>> Melbourne-pm mailing list
>> Melbourne-pm at pm.org
>> http://mail.pm.org/mailman/**listinfo/melbourne-pm<http://mail.pm.org/mailman/listinfo/melbourne-pm>
>>
>>
> ______________________________**_________________
> Melbourne-pm mailing list
> Melbourne-pm at pm.org
> http://mail.pm.org/mailman/**listinfo/melbourne-pm<http://mail.pm.org/mailman/listinfo/melbourne-pm>
>



-- 
Ian Macdonald
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.pm.org/pipermail/melbourne-pm/attachments/20120917/0974dc7e/attachment-0001.html>


More information about the Melbourne-pm mailing list