X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2FMouse.git;a=blobdiff_plain;f=t%2F020_attributes%2F022_illegal_options_for_inheritance.t;fp=t%2F020_attributes%2F022_illegal_options_for_inheritance.t;h=014d9465604d2dee898b2f83c47a5c8af93cabfa;hp=0000000000000000000000000000000000000000;hb=4a07d07686d449924ad2ace3cffa03a79fe75951;hpb=df7e47294bc932e837f0548f61125e84fe56eb94 diff --git a/t/020_attributes/022_illegal_options_for_inheritance.t b/t/020_attributes/022_illegal_options_for_inheritance.t new file mode 100644 index 0000000..014d946 --- /dev/null +++ b/t/020_attributes/022_illegal_options_for_inheritance.t @@ -0,0 +1,80 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Test::More; +use Test::Exception; + +{ + package Foo; + use Mouse; + + has foo => ( + is => 'ro', + ); + + has bar => ( + clearer => 'clear_bar', + ); +} + +{ + package Foo::Sub; + use Mouse; + + extends 'Foo'; + + ::throws_ok { has '+foo' => (is => 'rw') } qr/illegal/, "can't override is"; + ::throws_ok { has '+foo' => (reader => 'bar') } qr/illegal/, "can't override reader"; + ::lives_ok { has '+foo' => (clearer => 'baz') } "can override unspecified things"; + + ::throws_ok { has '+bar' => (clearer => 'quux') } qr/illegal/, "can't override clearer"; + ::lives_ok { has '+bar' => (predicate => 'has_bar') } "can override unspecified things"; +} + +{ + package Bar::Meta::Attribute; + use Mouse::Role; + + has my_illegal_option => (is => 'ro'); + + around illegal_options_for_inheritance => sub { + return (shift->(@_), 'my_illegal_option'); + }; +} + +{ + package Bar; + use Mouse; + + ::lives_ok { + has bar => ( + traits => ['Bar::Meta::Attribute'], + my_illegal_option => 'FOO', + is => 'bare', + ); + } "can use illegal options"; + + has baz => ( + traits => ['Bar::Meta::Attribute'], + is => 'bare', + ); +} + +{ + package Bar::Sub; + use Mouse; + + extends 'Bar'; + + ::throws_ok { has '+bar' => (my_illegal_option => 'BAR') } + qr/illegal/, + "can't override illegal attribute"; + ::lives_ok { has '+baz' => (my_illegal_option => 'BAR') } + "can add illegal option if superclass doesn't set it"; +} + +my $bar_attr = Bar->meta->get_attribute('bar'); +ok((grep { $_ eq 'my_illegal_option' } $bar_attr->illegal_options_for_inheritance) > 0, '... added my_illegal_option as illegal option for inheritance'); + +done_testing;