type-coercion-meta-object
[gitmo/Moose.git] / lib / Moose / Meta / Class.pm
1
2 package Moose::Meta::Class;
3
4 use strict;
5 use warnings;
6
7 use Carp 'confess';
8
9 our $VERSION = '0.02';
10
11 use base 'Class::MOP::Class';
12
13 sub construct_instance {
14     my ($class, %params) = @_;
15     my $instance = $params{'__INSTANCE__'} || {};
16     foreach my $attr ($class->compute_all_applicable_attributes()) {
17         my $init_arg = $attr->init_arg();
18         # try to fetch the init arg from the %params ...
19         my $val;        
20         $val = $params{$init_arg} if exists $params{$init_arg};
21         # if nothing was in the %params, we can use the 
22         # attribute's default value (if it has one)
23         $val ||= $attr->default($instance) if $attr->has_default; 
24                 if (defined $val) {
25                     if ($attr->has_type_constraint) {
26                     if ($attr->has_coercion && $attr->type_constraint->has_coercion) {
27                         $val = $attr->type_constraint->coercion->coerce($val);
28                     }   
29                 (defined($attr->type_constraint->check($val))) 
30                     || confess "Attribute (" . $attr->name . ") does not pass the type contraint with '$val'";                  
31             }
32                 }
33         $instance->{$attr->name} = $val;
34     }
35     return $instance;
36 }
37
38 1;
39
40 __END__
41
42 =pod
43
44 =head1 NAME
45
46 Moose::Meta::Class - The Moose metaclass
47
48 =head1 SYNOPSIS
49
50 =head1 DESCRIPTION
51
52 This is a subclass of L<Class::MOP::Class> with Moose specific 
53 extensions.
54
55 =head1 METHODS
56
57 =over 4
58
59 =item B<construct_instance>
60
61 =item B<mixed_in>
62
63 =back
64
65 =head1 BUGS
66
67 All complex software has bugs lurking in it, and this module is no 
68 exception. If you find a bug please either email me, or add the bug
69 to cpan-RT.
70
71 =head1 AUTHOR
72
73 Stevan Little E<lt>stevan@iinteractive.comE<gt>
74
75 =head1 COPYRIGHT AND LICENSE
76
77 Copyright 2006 by Infinity Interactive, Inc.
78
79 L<http://www.iinteractive.com>
80
81 This library is free software; you can redistribute it and/or modify
82 it under the same terms as Perl itself. 
83
84 =cut