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