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