0_03_01
[gitmo/Moose.git] / lib / Moose / Meta / Class.pm
CommitLineData
c0e30cf5 1
2package Moose::Meta::Class;
3
4use strict;
5use warnings;
6
6ba6d68c 7use Carp 'confess';
a7d0cd00 8use Scalar::Util 'weaken', 'blessed';
a15dff8d 9
78cd1d3b 10our $VERSION = '0.04';
bc1e29b5 11
c0e30cf5 12use base 'Class::MOP::Class';
13
a15dff8d 14sub construct_instance {
15 my ($class, %params) = @_;
e522431d 16 my $instance = $params{'__INSTANCE__'} || {};
a15dff8d 17 foreach my $attr ($class->compute_all_applicable_attributes()) {
18 my $init_arg = $attr->init_arg();
19 # try to fetch the init arg from the %params ...
20 my $val;
ca01a97b 21 if (exists $params{$init_arg}) {
22 $val = $params{$init_arg};
23 }
24 else {
25 # skip it if it's lazy
26 next if $attr->is_lazy;
27 # and die if it is required
28 confess "Attribute (" . $attr->name . ") is required"
29 if $attr->is_required
30 }
a15dff8d 31 # if nothing was in the %params, we can use the
32 # attribute's default value (if it has one)
8339fae2 33 if (!defined $val && $attr->has_default) {
34 $val = $attr->default($instance);
35 }
00867c44 36 if (defined $val) {
00867c44 37 if ($attr->has_type_constraint) {
34a66aa3 38 if ($attr->should_coerce && $attr->type_constraint->has_coercion) {
a27aa600 39 $val = $attr->type_constraint->coercion->coerce($val);
7415b2cb 40 }
a27aa600 41 (defined($attr->type_constraint->check($val)))
66811d63 42 || confess "Attribute (" . $attr->name . ") does not pass the type contraint with '$val'";
00867c44 43 }
a15dff8d 44 }
45 $instance->{$attr->name} = $val;
6ba6d68c 46 if (defined $val && $attr->is_weak_ref) {
47 weaken($instance->{$attr->name});
48 }
a15dff8d 49 }
50 return $instance;
51}
52
a7d0cd00 53sub has_method {
54 my ($self, $method_name) = @_;
55 (defined $method_name && $method_name)
56 || confess "You must define a method name";
57
58 my $sub_name = ($self->name . '::' . $method_name);
59
60 no strict 'refs';
61 return 0 if !defined(&{$sub_name});
62 my $method = \&{$sub_name};
63
64 return 1 if blessed($method) && $method->isa('Moose::Meta::Role::Method');
65 return $self->SUPER::has_method($method_name);
66}
67
68
78cd1d3b 69sub add_override_method_modifier {
70 my ($self, $name, $method, $_super_package) = @_;
71 # need this for roles ...
72 $_super_package ||= $self->name;
73 my $super = $self->find_next_method_by_name($name);
74 (defined $super)
75 || confess "You cannot override '$name' because it has no super method";
76 $self->add_method($name => sub {
77 my @args = @_;
78 no strict 'refs';
79 no warnings 'redefine';
80 local *{$_super_package . '::super'} = sub { $super->(@args) };
81 return $method->(@args);
82 });
83}
84
85sub add_augment_method_modifier {
86 my ($self, $name, $method) = @_;
87 my $super = $self->find_next_method_by_name($name);
88 (defined $super)
89 || confess "You cannot augment '$name' because it has no super method";
90 $self->add_method($name => sub {
91 my @args = @_;
92 no strict 'refs';
93 no warnings 'redefine';
94 local *{$super->package_name . '::inner'} = sub { $method->(@args) };
95 return $super->(@args);
96 });
97}
98
c0e30cf5 991;
100
101__END__
102
103=pod
104
105=head1 NAME
106
e522431d 107Moose::Meta::Class - The Moose metaclass
c0e30cf5 108
c0e30cf5 109=head1 DESCRIPTION
110
e522431d 111This is a subclass of L<Class::MOP::Class> with Moose specific
112extensions.
113
6ba6d68c 114For the most part, the only time you will ever encounter an
115instance of this class is if you are doing some serious deep
116introspection. To really understand this class, you need to refer
117to the L<Class::MOP::Class> documentation.
118
c0e30cf5 119=head1 METHODS
120
121=over 4
122
a15dff8d 123=item B<construct_instance>
124
6ba6d68c 125This provides some Moose specific extensions to this method, you
126almost never call this method directly unless you really know what
127you are doing.
128
129This method makes sure to handle the moose weak-ref, type-constraint
130and type coercion features.
ef1d5f4b 131
e9ec68d6 132=item B<has_method ($name)>
133
134This accomidates Moose::Meta::Role::Method instances, which are
135aliased, instead of added, but still need to be counted as valid
136methods.
137
78cd1d3b 138=item B<add_override_method_modifier ($name, $method)>
139
140=item B<add_augment_method_modifier ($name, $method)>
141
c0e30cf5 142=back
143
144=head1 BUGS
145
146All complex software has bugs lurking in it, and this module is no
147exception. If you find a bug please either email me, or add the bug
148to cpan-RT.
149
c0e30cf5 150=head1 AUTHOR
151
152Stevan Little E<lt>stevan@iinteractive.comE<gt>
153
154=head1 COPYRIGHT AND LICENSE
155
156Copyright 2006 by Infinity Interactive, Inc.
157
158L<http://www.iinteractive.com>
159
160This library is free software; you can redistribute it and/or modify
161it under the same terms as Perl itself.
162
163=cut