MooseX::hasn't - syntactic sugar to complement "has"
{ package Person; use Moose; has name => (is => "ro", writer => "_rename", required => 1); } { package AnonymousPerson; use Moose; use MooseX::hasn't; extends "Person"; hasn't name => (); } my $dude = AnonymousPerson->new; say($dude->can('_rename') ? 'true' : 'false'); # false say($dude->name); # croaks
hasn't is a counter-part for Moose's has.
hasn't
has
It tries to stop a child class inheriting something (an attribute or a method) from its parent class - though it's not always 100% successful.
The idea behind polymorphism is that if Bar inherits from Foo, then I should be able to use an object of type Bar wherever I'd normally use Foo.
In particular, if I can do:
Foo->new()->some_method();
then I should be able to do:
Bar->new()->some_method();
But if Bar can explicitly indicate that it hasn't got method some_method then this breaks. So, yes, this module does break polymorphism.
some_method
But observe that it's not especially difficult to break polymorphism manually:
{ package Foo; use Moose; sub some_method {} } { package Bar; use Moose; extends 'Foo'; sub some_method { die "some_method not found in package Bar" } }
This module just makes it easier and more declarative.
For hasn't $method, it simply adds an override method modifier to the given method that croaks.
hasn't $method
For hasn't $attribute, it finds the names of the accessor, reader, writer, clearer, predicate and initializer methods for that attribute (if any) and overrides them all.
hasn't $attribute
In both cases, it overrides the class' can method too.
can
If the parent class has an attribute which is required and has a default, then you can use hasn't in a child class safely.
If the parent class has an attribute which is required but has no default, then you must explicitly specify a default in the child class:
hasn't name => (default => 'anon');
This latter technique is probably not foolproof. Defaults may be coderefs, like in has.
hasn't $attr (default => sub {}) will execute the coderef as a function with no arguments, not as a method.
hasn't $attr (default => sub {})
$object->meta can still see attributes and methods which have been "hasn'ted". Some serious Class::MOP fu is needed to fix this.
$object->meta
Report anything else here:
http://rt.cpan.org/Dist/Display.html?Queue=Moose-hasn-t.
Moose.
Toby Inkster <tobyink@cpan.org>.
This software is copyright (c) 2012 by Toby Inkster.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
To install MooseX::hasn::t, copy and paste the appropriate command in to your terminal.
cpanm
cpanm MooseX::hasn::t
CPAN shell
perl -MCPAN -e shell install MooseX::hasn::t
For more information on module installation, please visit the detailed CPAN module installation guide.