bump version to 0.78
[gitmo/Moose.git] / lib / Moose / Object.pm
CommitLineData
fcd84ca9 1
2package Moose::Object;
3
4use strict;
5use warnings;
648e79ae 6
2eaf25da 7use Scalar::Util;
ae736ff4 8use Devel::GlobalDestruction qw(in_global_destruction);
2eaf25da 9
9922fa6f 10use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class';
11use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class';
bc1e29b5 12
85f8617c 13our $VERSION = '0.78';
e606ae5f 14$VERSION = eval $VERSION;
d44714be 15our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 16
17sub new {
2c0cbef7 18 my $class = shift;
2eaf25da 19
e606ae5f 20 my $params = $class->BUILDARGS(@_);
2eaf25da 21
22 # We want to support passing $self->new, but initialize
23 # takes only an unblessed class name
24 my $real_class = Scalar::Util::blessed($class) || $class;
25 my $self = Class::MOP::Class->initialize($real_class)->new_object($params);
26
e606ae5f 27 $self->BUILDALL($params);
2eaf25da 28
e606ae5f 29 return $self;
30}
31
32sub BUILDARGS {
33 my $class = shift;
a62dcd43 34 if ( scalar @_ == 1 ) {
35 unless ( defined $_[0] && ref $_[0] eq 'HASH' ) {
46047bea 36 Class::MOP::class_of($class)->throw_error(
a62dcd43 37 "Single parameters to new() must be a HASH ref",
38 data => $_[0] );
86629f93 39 }
a62dcd43 40 return { %{ $_[0] } };
41 }
8a157bab 42 else {
e606ae5f 43 return {@_};
8a157bab 44 }
fcd84ca9 45}
46
c0e30cf5 47sub BUILDALL {
d03bd989 48 # NOTE: we ask Perl if we even
d44714be 49 # need to do this first, to avoid
50 # extra meta level calls
d03bd989 51 return unless $_[0]->can('BUILD');
fb1e11d5 52 my ($self, $params) = @_;
505033d9 53 foreach my $method (reverse Class::MOP::class_of($self)->find_all_methods_by_name('BUILD')) {
b8f014e7 54 $method->{code}->execute($self, $params);
fb1e11d5 55 }
c0e30cf5 56}
57
58sub DEMOLISHALL {
8955a780 59 my $self = shift;
d9359278 60 my ($in_global_destruction) = @_;
8955a780 61
62 # NOTE: we ask Perl if we even
cb5c79c9 63 # need to do this first, to avoid
8955a780 64 # extra meta level calls
cb5c79c9 65 return unless $self->can('DEMOLISH');
8955a780 66
67 # This is a hack, because Moose::Meta::Class may not be the right
68 # metaclass, but class_of may return undef during global
69 # destruction, if the metaclass object has already been cleaned
70 # up.
71 my $meta = Class::MOP::class_of($self)
72 || Moose::Meta::Class->initialize( ref $self );
73
c063fc8b 74 # can't just use find_all_methods_by_name here because during global
75 # destruction, the method meta-object may have already been
76 # destroyed
77 foreach my $class ( $meta->linearized_isa ) {
78 no strict 'refs';
79 my $demolish = *{"${class}::DEMOLISH"}{CODE};
80 $self->$demolish($in_global_destruction)
81 if defined $demolish;
3a0c064a 82 }
83}
84
d03bd989 85sub DESTROY {
3a0c064a 86 # if we have an exception here ...
ca0e380d 87 if ($@) {
88 # localize the $@ ...
89 local $@;
3a0c064a 90 # run DEMOLISHALL ourselves, ...
ae736ff4 91 $_[0]->DEMOLISHALL(in_global_destruction);
3a0c064a 92 # and return ...
93 return;
94 }
ca0e380d 95 # otherwise it is normal destruction
ae736ff4 96 $_[0]->DEMOLISHALL(in_global_destruction);
c0e30cf5 97}
98
e606ae5f 99# support for UNIVERSAL::DOES ...
100BEGIN {
101 my $does = UNIVERSAL->can("DOES") ? "SUPER::DOES" : "isa";
102 eval 'sub DOES {
103 my ( $self, $class_or_role_name ) = @_;
104 return $self->'.$does.'($class_or_role_name)
105 || $self->does($class_or_role_name);
106 }';
107}
108
d03bd989 109# new does() methods will be created
50bc108b 110# as appropiate see Moose::Meta::Role
0677220d 111sub does {
bdabd620 112 my ($self, $role_name) = @_;
66d33a5c 113 my $meta = Class::MOP::class_of($self);
be05faea 114 (defined $role_name)
115 || $meta->throw_error("You much supply a role name to does()");
bdabd620 116 foreach my $class ($meta->class_precedence_list) {
587e457d 117 my $m = $meta->initialize($class);
d03bd989 118 return 1
119 if $m->can('does_role') && $m->does_role($role_name);
bdabd620 120 }
d03bd989 121 return 0;
0677220d 122}
ef333f17 123
d03bd989 124sub dump {
f742dfef 125 my $self = shift;
126 require Data::Dumper;
1a386a6c 127 local $Data::Dumper::Maxdepth = shift if @_;
f742dfef 128 Data::Dumper::Dumper $self;
129}
130
fcd84ca9 1311;
132
133__END__
134
135=pod
136
137=head1 NAME
138
e522431d 139Moose::Object - The base object for Moose
fcd84ca9 140
fcd84ca9 141=head1 DESCRIPTION
142
080e3614 143This class is the default base class for all Moose-using classes. When
144you C<use Moose> in this class, your class will inherit from this
145class.
6ba6d68c 146
080e3614 147It provides a default constructor and destructor, which run the
148C<BUILDALL> and C<DEMOLISHALL> methods respectively.
149
150You don't actually I<need> to inherit from this in order to use Moose,
151but it makes it easier to take advantage of all of Moose's features.
6ba6d68c 152
fcd84ca9 153=head1 METHODS
154
155=over 4
156
080e3614 157=item B<< Moose::Object->new(%params) >>
158
159This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new
160instance of the appropriate class. Once the instance is created, it
161calls C<< $instance->BUILDALL($params) >>.
fcd84ca9 162
080e3614 163=item B<< Moose::Object->BUILDARGS(%params) >>
6ba6d68c 164
080e3614 165The default implementation of this method accepts a hash or hash
166reference of named parameters. If it receives a single argument that
167I<isn't> a hash reference it throws an error.
fcd84ca9 168
080e3614 169You can override this method in your class to handle other types of
170options passed to the constructor.
e606ae5f 171
080e3614 172This method should always return a hash reference of named options.
e606ae5f 173
080e3614 174=item B<< $object->BUILDALL($params) >>
e522431d 175
080e3614 176This method will call every C<BUILD> method in the inheritance
177hierarchy, starting with the most distant parent class and ending with
178the object's class.
c0e30cf5 179
080e3614 180The C<BUILD> method will be passed the hash reference returned by
181C<BUILDARGS>.
e522431d 182
080e3614 183=item B<< $object->DEMOLISHALL >>
c0e30cf5 184
080e3614 185This will call every C<DEMOLISH> method in the inheritance hierarchy,
186starting with the object's class and ending with the most distant
c3fdacda 187parent. C<DEMOLISHALL> and C<DEMOLISH> will receive a boolean
188indicating whether or not we are currently in global destruction.
e522431d 189
080e3614 190=item B<< $object->does($role_name) >>
ef333f17 191
080e3614 192This returns true if the object does the given role.
02a0fb52 193
e606ae5f 194=item B<DOES ($class_or_role_name)>
195
080e3614 196This is a a Moose role-aware implementation of L<UNIVERSAL/DOES>.
e606ae5f 197
080e3614 198This is effectively the same as writing:
e606ae5f 199
080e3614 200 $object->does($name) || $object->isa($name)
f742dfef 201
080e3614 202This method will work with Perl 5.8, which did not implement
203C<UNIVERSAL::DOES>.
f742dfef 204
080e3614 205=item B<< $object->dump($maxdepth) >>
f742dfef 206
080e3614 207This is a handy utility for C<Data::Dumper>ing an object. By default,
208the maximum depth is 1, to avoid making a mess.
f742dfef 209
fcd84ca9 210=back
211
212=head1 BUGS
213
d03bd989 214All complex software has bugs lurking in it, and this module is no
fcd84ca9 215exception. If you find a bug please either email me, or add the bug
216to cpan-RT.
217
fcd84ca9 218=head1 AUTHOR
219
220Stevan Little E<lt>stevan@iinteractive.comE<gt>
221
222=head1 COPYRIGHT AND LICENSE
223
2840a3b2 224Copyright 2006-2009 by Infinity Interactive, Inc.
fcd84ca9 225
226L<http://www.iinteractive.com>
227
228This library is free software; you can redistribute it and/or modify
d03bd989 229it under the same terms as Perl itself.
fcd84ca9 230
9922fa6f 231=cut