refactoring-n-tests
[gitmo/Class-MOP.git] / examples / Perl6Attribute.pod
CommitLineData
e2f8b029 1
9ec169fe 2package # hide the package from PAUSE
3 Perl6Attribute;
e2f8b029 4
5use strict;
6use warnings;
7
a4258ffd 8our $VERSION = '0.02';
e2f8b029 9
10use base 'Class::MOP::Attribute';
11
a4258ffd 12Perl6Attribute->meta->add_around_method_modifier('new' => sub {
13 my $cont = shift;
e2f8b029 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
a4258ffd 26 $cont->($class, $attribute_name, %options);
27});
e2f8b029 28
291;
30
31__END__
32
33=pod
34
35=head1 NAME
36
9ec169fe 37Perl6Attribute - An example attribute metaclass for Perl 6 style attributes
e2f8b029 38
39=head1 SYNOPSIS
40
41 package Foo;
42
e2f8b029 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;
5659d76e 49 $class->meta->new_object(@_);
e2f8b029 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 AUTHOR
69
70Stevan Little E<lt>stevan@iinteractive.comE<gt>
71
72=head1 COPYRIGHT AND LICENSE
73
74Copyright 2006 by Infinity Interactive, Inc.
75
76L<http://www.iinteractive.com>
77
78This library is free software; you can redistribute it and/or modify
79it under the same terms as Perl itself.
80
81=cut