Skip Alien-Ditaa
[gitmo/Moose.git] / examples / Perl6Attribute.pod
CommitLineData
38bf2a25 1
2package # hide the package from PAUSE
3 Perl6Attribute;
4
5use strict;
6use warnings;
7
8our $VERSION = '0.02';
9
10use base 'Class::MOP::Attribute';
11
12Perl6Attribute->meta->add_around_method_modifier('new' => sub {
13 my $cont = shift;
14 my ($class, $attribute_name, %options) = @_;
15
16 # extract the sigil and accessor name
17 my ($sigil, $accessor_name) = ($attribute_name =~ /^([\$\@\%])\.(.*)$/);
18
19 # pass the accessor name
20 $options{accessor} = $accessor_name;
21
22 # create a default value based on the sigil
23 $options{default} = sub { [] } if ($sigil eq '@');
24 $options{default} = sub { {} } if ($sigil eq '%');
25
26 $cont->($class, $attribute_name, %options);
27});
28
291;
30
31__END__
32
33=pod
34
35=head1 NAME
36
37Perl6Attribute - An example attribute metaclass for Perl 6 style attributes
38
39=head1 SYNOPSIS
40
41 package Foo;
42
43 Foo->meta->add_attribute(Perl6Attribute->new('$.foo'));
44 Foo->meta->add_attribute(Perl6Attribute->new('@.bar'));
45 Foo->meta->add_attribute(Perl6Attribute->new('%.baz'));
46
47 sub new {
48 my $class = shift;
49 $class->meta->new_object(@_);
50 }
51
52=head1 DESCRIPTION
53
54This is an attribute metaclass which implements Perl 6 style
55attributes, including the auto-generating accessors.
56
57This code is very simple, we only need to subclass
58C<Class::MOP::Attribute> and override C<&new>. Then we just
59pre-process the attribute name, and create the accessor name
60and default value based on it.
61
62More advanced features like the C<handles> trait (see
63L<Perl6::Bible/A12>) can be accomplished as well doing the
64same pre-processing approach. This is left as an exercise to
65the reader though (if you do it, please send me a patch
66though, and will update this).
67
68=head1 AUTHORS
69
70Stevan Little E<lt>stevan@iinteractive.comE<gt>
71
72Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
73
74=head1 COPYRIGHT AND LICENSE
75
76Copyright 2006-2008 by Infinity Interactive, Inc.
77
78L<http://www.iinteractive.com>
79
80This library is free software; you can redistribute it and/or modify
81it under the same terms as Perl itself.
82
83=cut