use Scalar::Util qw( isweak );
use Test::More;
-my $HasMXAH;
-BEGIN
-{
- if ( eval 'use MooseX::AttributeHelpers 0.12; 1;' )
- {
- $HasMXAH = 1;
- }
-}
-
-plan tests => 25;
-
{
package HasClassAttribute;
use Moose qw( has );
use MooseX::ClassAttribute;
+ use MooseX::AttributeHelpers;
use vars qw($Lazy);
$Lazy = 0;
( is => 'rw',
isa => 'Delegatee',
handles => [ 'units', 'color' ],
+ # if it's not lazy it makes a new object before we define
+ # Delegatee's attributes.
+ lazy => 1,
default => sub { Delegatee->new() },
);
- if ($HasMXAH)
- {
- class_has 'Mapping' =>
- ( metaclass => 'Collection::Hash',
- is => 'rw',
- isa => 'HashRef[Str]',
- default => sub { {} },
- provides =>
- { exists => 'ExistsInMapping',
- keys => 'IdsInMapping',
- get => 'GetMapping',
- set => 'SetMapping',
- },
- );
- }
+ class_has 'Mapping' =>
+ ( metaclass => 'Collection::Hash',
+ is => 'rw',
+ isa => 'HashRef[Str]',
+ default => sub { {} },
+ provides =>
+ { exists => 'ExistsInMapping',
+ keys => 'IdsInMapping',
+ get => 'GetMapping',
+ set => 'SetMapping',
+ },
+ );
+
+ class_has 'Built' =>
+ ( is => 'ro',
+ builder => '_BuildIt',
+ );
+
+ class_has 'LazyBuilt' =>
+ ( is => 'ro',
+ lazy => 1,
+ builder => '_BuildIt',
+ );
+
+ class_has 'Triggerish' =>
+ ( is => 'rw',
+ trigger => sub { shift->_CallTrigger(@_) },
+ );
has 'size' =>
( is => 'rw',
);
no Moose;
- no MooseX::ClassAttribute;
sub BUILD
{
$self->ObjectCount( $self->ObjectCount() + 1 );
}
+ sub _BuildIt { 42 }
+
+ our @Triggered;
+ sub _CallTrigger
+ {
+ push @Triggered, [@_];
+ }
+
sub make_immutable
{
my $class = shift;
$class->meta()->make_immutable();
- MooseX::ClassAttribute::container_class()->meta()->make_immutable();
Delegatee->meta()->make_immutable();
}
}
( is => 'ro',
default => 'blue',
);
+
+ no Moose;
}
{
class_has '+ReadOnlyAttribute' =>
( default => 30 );
+
+ class_has 'YetAnotherAttribute' =>
+ ( is => 'ro',
+ default => 'thing',
+ );
+
+ no Moose;
}
sub run_tests
{
+ plan tests => 30;
+
local $Test::Builder::Level = $Test::Builder::Level + 1;
{
}
{
- ok( ! HasClassAttribute->can('class_has'),
- q{'no MooseX::ClassAttribute' remove class_has from HasClassAttribute} );
- }
-
- SKIP:
- {
- skip 'These tests require MooseX::AttributeHelpers', 4
- unless $HasMXAH;
-
my @ids = HasClassAttribute->IdsInMapping();
is( scalar @ids, 0,
'there are no keys in the mapping yet' );
is( HasClassAttribute->GetMapping('a'), 20,
'value for a in mapping is 20' );
}
+
+ {
+ is( HasClassAttribute->Built(), 42,
+ 'attribute with builder works' );
+
+ is( HasClassAttribute->LazyBuilt(), 42,
+ 'attribute with lazy builder works' );
+ }
+
+ {
+ HasClassAttribute->Triggerish(42);
+ is( scalar @HasClassAttribute::Triggered, 1, 'trigger was called' );
+ is( HasClassAttribute->Triggerish(), 42, 'Triggerish is now 42' );
+
+ HasClassAttribute->Triggerish(84);
+ is( HasClassAttribute->Triggerish(), 84, 'Triggerish is now 84' );
+
+ is_deeply( \@HasClassAttribute::Triggered,
+ [ [ qw( HasClassAttribute 42 ) ],
+ [ qw( HasClassAttribute 84 42 ) ],
+ ],
+ 'trigger passes old value correctly' );
+ }
}