bump version and update changes
[gitmo/MooseX-StrictConstructor.git] / lib / MooseX / StrictConstructor.pm
1 package MooseX::StrictConstructor;
2
3 use strict;
4 use warnings;
5
6 our $VERSION = '0.06_02';
7 $VERSION = eval $VERSION;
8
9 use Class::MOP ();
10 use Moose 0.5504 ();
11 use Moose::Exporter;
12 use Moose::Util::MetaRole;
13 use MooseX::StrictConstructor::Role::Object;
14 use MooseX::StrictConstructor::Role::Meta::Method::Constructor;
15
16
17 Moose::Exporter->setup_import_methods();
18
19 sub init_meta
20 {
21     shift;
22     my %p = @_;
23
24     Moose->init_meta(%p);
25
26     my $caller = $p{for_class};
27
28     Moose::Util::MetaRole::apply_metaclass_roles
29         ( for_class => $caller,
30           constructor_class_roles =>
31           ['MooseX::StrictConstructor::Role::Meta::Method::Constructor'],
32         );
33
34     Moose::Util::MetaRole::apply_base_class_roles
35         ( for_class => $caller,
36           roles =>
37           [ 'MooseX::StrictConstructor::Role::Object' ],
38         );
39
40     return $caller->meta();
41 }
42
43 1;
44
45 __END__
46
47 =pod
48
49 =head1 NAME
50
51 MooseX::StrictConstructor - Make your object constructors blow up on unknown attributes
52
53 =head1 SYNOPSIS
54
55     package My::Class;
56
57     use Moose;
58     use MooseX::StrictConstructor;
59
60     has 'size' => ...;
61
62     # then later ...
63
64     # this blows up because color is not a known attribute
65     My::Class->new( size => 5, color => 'blue' );
66
67 =head1 DESCRIPTION
68
69 Simply loading this module makes your constructors "strict". If your
70 constructor is called with an attribute init argument that your class
71 does not declare, then it calls "Carp::confess()". This is a great way
72 to catch small typos.
73
74 =head2 Subverting Strictness
75
76 You may find yourself wanting to have your constructor accept a
77 parameter which does not correspond to an attribute.
78
79 In that case, you'll probably also be writing a C<BUILD()> or
80 C<BUILDARGS()> method to deal with that parameter. In a C<BUILDARGS()>
81 method, you can simply make sure that this parameter is not included
82 in the hash reference you return. Otherwise, in a C<BUILD()> method,
83 you can delete it from the hash reference of parameters.
84
85   sub BUILD {
86       my $self   = shift;
87       my $params = shift;
88
89       if ( delete $params->{do_something} ) {
90           ...
91       }
92   }
93
94 =head1 AUTHOR
95
96 Dave Rolsky, C<< <autarch@urth.org> >>
97
98 =head1 BUGS
99
100 Please report any bugs or feature requests to
101 C<bug-moosex-strictconstructor@rt.cpan.org>, or through the web
102 interface at L<http://rt.cpan.org>.  I will be notified, and then
103 you'll automatically be notified of progress on your bug as I make
104 changes.
105
106 =head1 COPYRIGHT & LICENSE
107
108 Copyright 2007-2008 Dave Rolsky, All Rights Reserved.
109
110 This program is free software; you can redistribute it and/or modify
111 it under the same terms as Perl itself.
112
113 =cut