making easier to extend
Stevan Little [Sat, 24 May 2008 04:55:10 +0000 (04:55 +0000)]
Changes
README
lib/MooseX/MetaDescription.pm
lib/MooseX/MetaDescription/Meta/Trait.pm
t/011_meta_desc_custom_traits.t [new file with mode: 0644]

diff --git a/Changes b/Changes
index 8978051..adca67f 100644 (file)
--- 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 (file)
--- 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
index 2695293..ebf6837 100644 (file)
@@ -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;
index 50bc1f4..cedb75a 100644 (file)
@@ -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<metadescription_classname>
 and it will all just work.
 
+=item B<prepare_traits_for_application ($traits)>
+
+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<meta>
 
diff --git a/t/011_meta_desc_custom_traits.t b/t/011_meta_desc_custom_traits.t
new file mode 100644 (file)
index 0000000..9b0fb5c
--- /dev/null
@@ -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');    
+}
+