From: Stevan Little Date: Sat, 24 May 2008 04:55:10 +0000 (+0000) Subject: making easier to extend X-Git-Tag: 0.04~11 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=7c697304c34ed8e620e2c41e3d5cce74c578b653;p=gitmo%2FMooseX-MetaDescription.git making easier to extend --- diff --git a/Changes b/Changes index 8978051..adca67f 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,12 @@ Revision history for Perl extension MooseX::MetaDescription +0.03 + * MooseX::MetaDescription::Meta::Trait + - added the prepare_traits_for_application method + to make modifying and pre-processing trait names + easier + - added tests for this + 0.02 Wed. May 7, 2008 ~~ documentation added for all modules ~~ diff --git a/README b/README index 6b9a211..4924488 100644 --- a/README +++ b/README @@ -1,4 +1,4 @@ -MooseX::MetaDescription version 0.02 +MooseX::MetaDescription version 0.03 =========================== See the individual module documentation for more information diff --git a/lib/MooseX/MetaDescription.pm b/lib/MooseX/MetaDescription.pm index 2695293..ebf6837 100644 --- a/lib/MooseX/MetaDescription.pm +++ b/lib/MooseX/MetaDescription.pm @@ -1,7 +1,7 @@ package MooseX::MetaDescription; use Moose; -our $VERSION = '0.02'; +our $VERSION = '0.03'; our $AUTHORITY = 'cpan:STEVAN'; use MooseX::MetaDescription::Meta::Class; diff --git a/lib/MooseX/MetaDescription/Meta/Trait.pm b/lib/MooseX/MetaDescription/Meta/Trait.pm index 50bc1f4..cedb75a 100644 --- a/lib/MooseX/MetaDescription/Meta/Trait.pm +++ b/lib/MooseX/MetaDescription/Meta/Trait.pm @@ -1,7 +1,7 @@ package MooseX::MetaDescription::Meta::Trait; use Moose::Role; -our $VERSION = '0.02'; +our $VERSION = '0.03'; our $AUTHORITY = 'cpan:STEVAN'; has 'description' => ( @@ -35,7 +35,7 @@ has 'metadescription' => ( if (my $traits = delete $desc->{traits}) { my $meta = Moose::Meta::Class->create_anon_class( superclasses => [ $metadesc_class ], - roles => $traits, + roles => $self->prepare_traits_for_application($traits), ); $meta->add_method('meta' => sub { $meta }); $metadesc_class = $meta->name; @@ -45,6 +45,9 @@ has 'metadescription' => ( }, ); +# this is for the subclasses to use ... +sub prepare_traits_for_application { $_[1] } + no Moose::Role; 1; __END__ @@ -99,6 +102,12 @@ it is generated lazily and is also read-only. In general you will never need to set this yourself, but simply set C and it will all just work. +=item B + +This is passed the ARRAY ref of trait names so that they can be pre-processed +before they are applied to the metadescription. It is expected to return +an ARRAY ref of trait names to be applied. By default it simply returns what +it is given. =item B diff --git a/t/011_meta_desc_custom_traits.t b/t/011_meta_desc_custom_traits.t new file mode 100644 index 0000000..9b0fb5c --- /dev/null +++ b/t/011_meta_desc_custom_traits.t @@ -0,0 +1,76 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +use Test::More no_plan => 1; +use Test::Exception; +use Test::Moose; + +BEGIN { + use_ok('MooseX::MetaDescription'); +} + +{ + package Foo::Description::Trait; + use Moose::Role; + + has 'bar' => (is => 'ro', isa => 'Str'); + has 'baz' => (is => 'ro', isa => 'Str'); + has 'gorch' => (is => 'ro', isa => 'Str'); +} + +{ + package Foo::MetaDescription::Attribute; + use Moose; + + extends 'MooseX::MetaDescription::Meta::Attribute'; + + sub prepare_traits_for_application { + my ($self, $traits) = @_; + [ map { "${_}::Description::Trait" } @$traits ] + } +} + +{ + package Foo; + use Moose; + + has 'baz' => ( + metaclass => 'Foo::MetaDescription::Attribute', + is => 'ro', + isa => 'Str', + default => sub { 'Foo::baz' }, + description => { + traits => [qw[Foo]], + bar => 'Foo::baz::bar', + gorch => 'Foo::baz::gorch', + } + ); +} + +# check the meta-desc + +my $baz_attr = Foo->meta->get_attribute('baz'); +isa_ok($baz_attr->metadescription, 'MooseX::MetaDescription::Description'); +does_ok($baz_attr->metadescription, 'Foo::Description::Trait'); +is($baz_attr->metadescription->descriptor, $baz_attr, '... got the circular ref'); + +# check the actual descs + +foreach my $foo ('Foo', Foo->new) { + + is_deeply( + $foo->meta->get_attribute('baz')->description, + { + bar => 'Foo::baz::bar', + gorch => 'Foo::baz::gorch', + }, + '... got the right class description' + ); + + my $baz_meta_desc = $foo->meta->get_attribute('baz')->metadescription; + is($baz_meta_desc->bar, 'Foo::baz::bar', '... we have methods'); + is($baz_meta_desc->gorch, 'Foo::baz::gorch', '... we have methods'); +} +