making easier to extend
[gitmo/MooseX-MetaDescription.git] / lib / MooseX / MetaDescription / Meta / Trait.pm
index 11ccb01..cedb75a 100644 (file)
@@ -1,7 +1,7 @@
 package MooseX::MetaDescription::Meta::Trait;
 use Moose::Role;
 
-our $VERSION   = '0.01';
+our $VERSION   = '0.03';
 our $AUTHORITY = 'cpan:STEVAN';
 
 has 'description' => (
@@ -12,12 +12,12 @@ has 'description' => (
 );
 
 has 'metadescription_classname' => (
-    is      => 'ro',
+    is      => 'rw',
     isa     => 'Str', 
     lazy    => 1,  
     default => sub {
         'MooseX::MetaDescription::Description'
-    }  
+    }
 );
 
 has 'metadescription' => (
@@ -30,10 +30,12 @@ has 'metadescription' => (
         my $metadesc_class = $self->metadescription_classname;
         my $desc           = $self->description;
         
+        Class::MOP::load_class($metadesc_class);
+        
         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;
@@ -43,6 +45,9 @@ has 'metadescription' => (
     },
 );
 
+# this is for the subclasses to use ...
+sub prepare_traits_for_application { $_[1] }
+
 no Moose::Role; 1;
 
 __END__
@@ -53,10 +58,28 @@ __END__
 
 MooseX::MetaDescription::Meta::Trait - Custom class meta-trait for meta-descriptions
 
+=head1 SYNOPSIS
+
+  package Foo;
+  use Moose;
+  
+  has 'baz' => (
+      # apply this as a trait to your attribute
+      traits      => [ 'MooseX::MetaDescription::Meta::Trait' ],
+      is          => 'ro',
+      isa         => 'Str',   
+      default     => sub { 'Foo::baz' },
+      description => {
+          bar   => 'Foo::baz::bar',
+          gorch => 'Foo::baz::gorch',
+      }
+  );
+
 =head1 DESCRIPTION
 
-Nothing worth saying yet actually, mostly internal usage only. See the 
-SYNPOSIS in L<MooseX::MetaDescription> for an example of usage.
+This is the core of the Meta Description functionality, it is a role that is done
+by both L<MooseX::MetaDescription::Meta::Attribute> and L<MooseX::MetaDescription::Meta::Class>
+and can be used on it's own as a meta-attribute trait.
 
 =head1 METHODS 
 
@@ -64,10 +87,32 @@ SYNPOSIS in L<MooseX::MetaDescription> for an example of usage.
 
 =item B<description>
 
+The description C<HASH> ref is stored here.
+
 =item B<metadescription_classname>
 
+This provides the name of the metadescription class, currently this 
+defaults to L<MooseX::MetaDescription::Description>. It is read only 
+and so can only be specified at instance construction time.
+
 =item B<metadescription>
 
+This is the instance of the class specified in C<metadescription_classname>
+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>
+
+The L<Moose::Role> metaclass.
+
 =back
 
 =head1 BUGS