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