bump version to 0.05
[gitmo/Moose-Policy.git] / lib / Moose / Policy.pm
CommitLineData
82cfc049 1package Moose::Policy;
4fe62f68 2use Moose 'confess', 'blessed';
82cfc049 3
dcbf286b 4our $VERSION = '0.05';
4fe62f68 5our $AUTHORITY = 'cpan:STEVAN';
b9238462 6
2756232e 7sub import {
8 shift;
9
10 my $policy = shift || return;
11
95c5abfd 12 unless (Class::MOP::is_class_loaded($policy)) {
83d85197 13 # otherwise require it ...
4fe62f68 14 eval { Class::MOP::load_class($policy) };
15 confess "Could not load policy module '$policy' because : $@"
cdaa4ee1 16 if $@;
2756232e 17 }
18
19 my $package = caller();
20 $package->can('meta') and
09eff61e 21 croak("'$package' already has a meta() method, this is very problematic");
2756232e 22
23 my $metaclass = 'Moose::Meta::Class';
24 $metaclass = $policy->metaclass($package)
25 if $policy->can('metaclass');
26
27 my %options;
28
29 # build options out of policy's constants
4fe62f68 30 $policy->can($_) and $options{"$_"} = $policy->$_($package)
2756232e 31 for (qw(
32 attribute_metaclass
33 instance_metaclass
34 method_metaclass
35 ));
36
37 # create a meta object so we can install &meta
38 my $meta = $metaclass->initialize($package => %options);
39 $meta->add_method('meta' => sub {
40 # we must re-initialize so that it works as expected in
41 # subclasses, since metaclass instances are singletons, this is
42 # not really a big deal anyway.
43 $metaclass->initialize((blessed($_[0]) || $_[0]) => %options)
44 });
45}
46
471;
48
49__END__
50
51=pod
52
8e7059d6 53=head1 NAME
54
4fe62f68 55Moose::Policy - Moose-mounted police
8e7059d6 56
57=head1 SYNOPSIS
58
8e7059d6 59 package Foo;
60
09eff61e 61 use Moose::Policy 'Moose::Policy::FollowPBP';
8e7059d6 62 use Moose;
63
64 has 'bar' => (is => 'rw', default => 'Foo::bar');
65 has 'baz' => (is => 'ro', default => 'Foo::baz');
66
09eff61e 67 # Foo now has (get, set)_bar methods as well as get_baz
68
3d1dec0a 69=head1 DEPRECATION NOTICE
70
71B<Moose::Policy is deprecated>.
72
73L<MooseX::FollowPBP> replaces the L<Moose::Policy::FollowPBP> module. The
74other policies included in this distribution do not yet have standalone MooseX
75modules, as of November, 2010.
76
2756232e 77=head1 DESCRIPTION
8e7059d6 78
09eff61e 79This module allows you to specify your project-wide or even company-wide
80Moose meta-policy.
8e7059d6 81
09eff61e 82Most all of Moose's features can be customized through the use of custom
83metaclasses, however fiddling with the metaclasses can be hairy. Moose::Policy
84removes most of that hairiness and makes it possible to cleanly contain
85a set of meta-level customizations in one easy to use module.
2756232e 86
4fe62f68 87This is still an release of this module and it should not be considered to
1c037baf 88be complete by any means. It is very basic implemenation at this point and
09eff61e 89will likely get more feature-full over time, as people request features.
90So if you have a suggestion/need/idea, please speak up.
91
92=head2 What is a meta-policy?
93
94A meta-policy is a set of custom Moose metaclasses which can be used to
95implement a number of customizations and restrictions on a particular
96Moose class.
97
98For instance, L<Moose::Policy::SingleInheritence> enforces that all
bae6d4c3 99specified Moose classes can only use single inheritance. It does this
09eff61e 100by trapping the call to C<superclasses> on the metaclass and only allowing
101you to assign a single superclass.
102
103The L<Moose::Policy::FollowPBP> policy changes the default behavior of
104accessors to fit the recomendations found in Perl Best Practices.
105
106=head1 CAVEATS
8e7059d6 107
09eff61e 108=head2 Always load Moose::Policy first.
109
110You B<must> put the following line of code:
8e7059d6 111
112 use Moose::Policy 'My::Policy';
113
09eff61e 114before this line:
8e7059d6 115
116 use Moose;
117
09eff61e 118This is because Moose::Policy must be given the opportunity to set the
119custom metaclass before Moose has set it's default metaclass. In fact, if
120you try to set a Moose::Policy and there is a C<meta> method available,
121not only will kittens die, but your program will too.
122
bae6d4c3 123=head2 Policies are class scoped
09eff61e 124
bae6d4c3 125You must repeat the policy for each class you want to use it. It is B<not>
09eff61e 126inherited. This may change in the future, probably it will be a Moose::Policy
bae6d4c3 127itself to allow Moose policies to be inherited.
8e7059d6 128
09eff61e 129=head1 THE POLICY
8e7059d6 130
50e80884 131A Policy is set by passing C<Moose::Policy::import()> a package name. This
09eff61e 132package is then queried for what metaclasses it should use. The possible
133metaclass values are:
8e7059d6 134
135=over
136
09eff61e 137=item B<metaclass>
8e7059d6 138
09eff61e 139This defaults to C<Moose::Meta::Class>.
8e7059d6 140
09eff61e 141=item B<attribute_metaclass>
8e7059d6 142
09eff61e 143=item B<instance_metaclass>
8e7059d6 144
09eff61e 145=item B<method_metaclass>
8e7059d6 146
147=back
148
09eff61e 149For examples of what a Policy actually looks like see the examples in
150C<Moose::Policy::> and the test suite. More docs to come on this later (probably
151a cookbook or something).
8e7059d6 152
4fe62f68 153=head1 METHODS
154
155=over 4
156
157=item B<meta>
158
159=back
160
09eff61e 161=head1 FUTURE PLANS
8e7059d6 162
09eff61e 163As I said above, this is the first release and it is by no means feature complete.
164There are a number of thoughts on the future direction of this module. Here are
165some random thoughts on that, in no particular order.
8e7059d6 166
09eff61e 167=over 4
8e7059d6 168
09eff61e 169=item Make set of policy roles
8e7059d6 170
09eff61e 171Roles are an excellent way to combine sets of behaviors together into one, and
172custom metaclasses are actually better composed by roles then by inheritence.
173The ideal situation is that this module will provide a set of roles which can be
bae6d4c3 174used to compose your meta-policy with relative ease.
8e7059d6 175
09eff61e 176=back
8e7059d6 177
2756232e 178=head1 BUGS
8e7059d6 179
2756232e 180All complex software has bugs lurking in it, and this module is no
181exception. If you find a bug please either email me, or add the bug
182to cpan-RT.
8e7059d6 183
2756232e 184=head1 AUTHOR
8e7059d6 185
2756232e 186Stevan Little E<lt>stevan@iinteractive.comE<gt>
8e7059d6 187
83d85197 188Eric Wilhelm
8e7059d6 189
2756232e 190=head1 COPYRIGHT AND LICENSE
8e7059d6 191
4fe62f68 192Copyright 2006-2007 by Infinity Interactive, Inc.
b9238462 193
2756232e 194L<http://www.iinteractive.com>
82cfc049 195
2756232e 196This library is free software; you can redistribute it and/or modify
197it under the same terms as Perl itself.
82cfc049 198
2756232e 199=cut
bfacd619 200