Revision history for Perl extension MooseX::MetaDescription
-0.03
+0.03
* MooseX::MetaDescription::Meta::Trait
- added the prepare_traits_for_application method
to make modifying and pre-processing trait names
* MooseX::MetaDescription::Meta::Trait
- making metadescription attribute default
also load the metadescription class
-
+
* MooseX::MetaDescription::Meta::Class
- - descriptions will now "inherit" by
- default, unless you specify the
+ - descriptions will now "inherit" by
+ default, unless you specify the
description explicitly
- added test for this
0.01 Friday, May 2, 2008
- - extracted from Ernst project into it's
- own package, cause it is useful
\ No newline at end of file
+ - extracted from Ernst project into it's
+ own package, cause it is useful
has 'description' => (
is => 'ro',
isa => 'HashRef',
- lazy => 1,
+ lazy => 1,
default => sub { +{} },
);
has 'metadescription_classname' => (
is => 'rw',
- isa => 'Str',
- lazy => 1,
+ isa => 'Str',
+ lazy => 1,
default => sub {
'MooseX::MetaDescription::Description'
}
has 'metadescription' => (
is => 'ro',
isa => 'MooseX::MetaDescription::Description',
- lazy => 1,
+ lazy => 1,
default => sub {
my $self = shift;
-
+
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 ],
$meta->add_method('meta' => sub { $meta });
$metadesc_class = $meta->name;
}
-
+
return $metadesc_class->new(%$desc, descriptor => $self);
},
);
package Foo;
use Moose;
-
+
has 'baz' => (
# apply this as a trait to your attribute
traits => [ 'MooseX::MetaDescription::Meta::Trait' ],
is => 'ro',
- isa => 'Str',
+ isa => 'Str',
default => sub { 'Foo::baz' },
description => {
bar => 'Foo::baz::bar',
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
+=head1 METHODS
=over 4
=item B<metadescription_classname>
-This provides the name of the metadescription class, currently this
-defaults to L<MooseX::MetaDescription::Description>. It is read only
+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
+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
+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>
=head1 BUGS
-All complex software has bugs lurking in it, and this module is no
+All complex software has bugs lurking in it, and this module is no
exception. If you find a bug please either email me, or add the bug
to cpan-RT.
{
package Foo::Description;
use Moose;
-
+
extends 'MooseX::MetaDescription::Description';
-
+
has 'bar' => (is => 'ro', isa => 'Str');
- has 'baz' => (is => 'ro', isa => 'Str');
- has 'gorch' => (is => 'ro', isa => 'Str');
-
+ has 'baz' => (is => 'ro', isa => 'Str');
+ has 'gorch' => (is => 'ro', isa => 'Str');
+
package Foo::MetaDescription::Trait;
use Moose::Role;
has '+metadescription_classname' => (
default => 'Foo::Description'
);
-
+
package Foo::MetaDescription::Attribute;
use Moose;
-
+
extends 'MooseX::MetaDescription::Meta::Attribute';
with 'Foo::MetaDescription::Trait';
-
+
has '+metadescription_classname' => (
default => 'Foo::Description'
- );
+ );
}
{
package Foo;
use Moose;
-
+
has 'bar' => (
metaclass => 'Foo::MetaDescription::Attribute',
is => 'ro',
- isa => 'Str',
+ isa => 'Str',
default => sub { 'Foo::bar' },
description => {
baz => 'Foo::bar::baz',
gorch => 'Foo::bar::gorch',
}
);
-
+
has 'baz' => (
traits => [ 'Foo::MetaDescription::Trait' ],
is => 'ro',
- isa => 'Str',
+ isa => 'Str',
default => sub { 'Foo::baz' },
description => {
bar => 'Foo::baz::bar',
gorch => 'Foo::baz::gorch',
}
- );
+ );
}
# check the meta-desc
},
'... got the right class description'
);
-
+
my $bar_meta_desc = $foo->meta->get_attribute('bar')->metadescription;
is($bar_meta_desc->baz, 'Foo::bar::baz', '... we have methods');
- is($bar_meta_desc->gorch, 'Foo::bar::gorch', '... we have methods');
+ is($bar_meta_desc->gorch, 'Foo::bar::gorch', '... we have methods');
is_deeply(
$foo->meta->get_attribute('baz')->description,
},
'... 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');
+ is($baz_meta_desc->gorch, 'Foo::baz::gorch', '... we have methods');
}
{
package Foo;
- use Moose;
-
+ use Moose;
+
has 'bar' => (
metaclass => 'MooseX::MetaDescription::Meta::Attribute',
is => 'ro',
- isa => 'Str',
+ isa => 'Str',
default => sub { 'Foo::bar' },
description => {
baz => 'Foo::bar::baz',
gorch => 'Foo::bar::gorch',
}
- );
-
+ );
+
has 'baz' => (
traits => [ 'MooseX::MetaDescription::Meta::Trait' ],
is => 'ro',
- isa => 'Str',
+ isa => 'Str',
default => sub { 'Foo::baz' },
description => {
bar => 'Foo::baz::bar',
gorch => 'Foo::baz::gorch',
}
- );
-
+ );
+
package Bar;
use Moose;
-
+
extends 'Foo';
}
is($baz_attr->metadescription->descriptor, $baz_attr, '... got the circular ref');
{
-
+
my $bar_attr = Bar->meta->find_attribute_by_name('bar');
-
- can_ok($bar_attr, 'description');
+
+ can_ok($bar_attr, 'description');
isa_ok($bar_attr->metadescription, 'MooseX::MetaDescription::Description');
is($bar_attr->metadescription->descriptor, $bar_attr, '... got the circular ref');
-
+
my $baz_attr = Bar->meta->find_attribute_by_name('baz');
-
- can_ok($baz_attr, 'description');
+
+ can_ok($baz_attr, 'description');
isa_ok($baz_attr->metadescription, 'MooseX::MetaDescription::Description');
is($baz_attr->metadescription->descriptor, $baz_attr, '... got the circular ref');
-
+
my ($bar_attr_2, $baz_attr_2) = Bar->meta->compute_all_applicable_attributes;
is($bar_attr, $bar_attr_2, '... got the same attribute');
is($baz_attr, $baz_attr_2, '... got the same attribute');
},
'... got the right class description'
);
-}
\ No newline at end of file
+}