bump version to 1.19
[gitmo/Moose.git] / lib / Moose / Object.pm
CommitLineData
fcd84ca9 1
2package Moose::Object;
3
4use strict;
5use warnings;
648e79ae 6
0d922627 7use Carp ();
f25f9912 8use Devel::GlobalDestruction ();
9use MRO::Compat ();
10use Scalar::Util ();
11use Try::Tiny ();
2eaf25da 12
9922fa6f 13use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class';
14use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class';
bc1e29b5 15
245478d5 16our $VERSION = '1.19';
e606ae5f 17$VERSION = eval $VERSION;
d44714be 18our $AUTHORITY = 'cpan:STEVAN';
fcd84ca9 19
20sub new {
2c0cbef7 21 my $class = shift;
f25f9912 22 my $real_class = Scalar::Util::blessed($class) || $class;
2eaf25da 23
a19ae3d7 24 my $params = $real_class->BUILDARGS(@_);
2eaf25da 25
a19ae3d7 26 return Class::MOP::Class->initialize($real_class)->new_object($params);
e606ae5f 27}
28
29sub BUILDARGS {
30 my $class = shift;
a62dcd43 31 if ( scalar @_ == 1 ) {
32 unless ( defined $_[0] && ref $_[0] eq 'HASH' ) {
46047bea 33 Class::MOP::class_of($class)->throw_error(
a62dcd43 34 "Single parameters to new() must be a HASH ref",
35 data => $_[0] );
86629f93 36 }
a62dcd43 37 return { %{ $_[0] } };
38 }
0d922627 39 elsif ( @_ % 2 ) {
40 Carp::carp(
41 "The new() method for $class expects a hash reference or a key/value list."
42 . " You passed an odd number of arguments" );
43 return { @_, undef };
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
17819f17 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
17819f17 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)
d9de4f04 124 || $meta->throw_error("You must supply a role name to does()");
b82ef9c3 125 return 1 if $meta->can('does_role') && $meta->does_role($role_name);
d03bd989 126 return 0;
0677220d 127}
ef333f17 128
d03bd989 129sub dump {
f742dfef 130 my $self = shift;
131 require Data::Dumper;
1a386a6c 132 local $Data::Dumper::Maxdepth = shift if @_;
f742dfef 133 Data::Dumper::Dumper $self;
134}
135
fcd84ca9 1361;
137
138__END__
139
140=pod
141
142=head1 NAME
143
e522431d 144Moose::Object - The base object for Moose
fcd84ca9 145
fcd84ca9 146=head1 DESCRIPTION
147
080e3614 148This class is the default base class for all Moose-using classes. When
149you C<use Moose> in this class, your class will inherit from this
150class.
6ba6d68c 151
080e3614 152It provides a default constructor and destructor, which run the
153C<BUILDALL> and C<DEMOLISHALL> methods respectively.
154
155You don't actually I<need> to inherit from this in order to use Moose,
156but it makes it easier to take advantage of all of Moose's features.
6ba6d68c 157
fcd84ca9 158=head1 METHODS
159
160=over 4
161
080e3614 162=item B<< Moose::Object->new(%params) >>
163
164This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new
165instance of the appropriate class. Once the instance is created, it
166calls C<< $instance->BUILDALL($params) >>.
fcd84ca9 167
080e3614 168=item B<< Moose::Object->BUILDARGS(%params) >>
6ba6d68c 169
080e3614 170The default implementation of this method accepts a hash or hash
171reference of named parameters. If it receives a single argument that
172I<isn't> a hash reference it throws an error.
fcd84ca9 173
080e3614 174You can override this method in your class to handle other types of
175options passed to the constructor.
e606ae5f 176
080e3614 177This method should always return a hash reference of named options.
e606ae5f 178
080e3614 179=item B<< $object->BUILDALL($params) >>
e522431d 180
080e3614 181This method will call every C<BUILD> method in the inheritance
182hierarchy, starting with the most distant parent class and ending with
183the object's class.
c0e30cf5 184
080e3614 185The C<BUILD> method will be passed the hash reference returned by
186C<BUILDARGS>.
e522431d 187
080e3614 188=item B<< $object->DEMOLISHALL >>
c0e30cf5 189
080e3614 190This will call every C<DEMOLISH> method in the inheritance hierarchy,
191starting with the object's class and ending with the most distant
c3fdacda 192parent. C<DEMOLISHALL> and C<DEMOLISH> will receive a boolean
193indicating whether or not we are currently in global destruction.
e522431d 194
080e3614 195=item B<< $object->does($role_name) >>
ef333f17 196
080e3614 197This returns true if the object does the given role.
02a0fb52 198
e606ae5f 199=item B<DOES ($class_or_role_name)>
200
080e3614 201This is a a Moose role-aware implementation of L<UNIVERSAL/DOES>.
e606ae5f 202
080e3614 203This is effectively the same as writing:
e606ae5f 204
080e3614 205 $object->does($name) || $object->isa($name)
f742dfef 206
080e3614 207This method will work with Perl 5.8, which did not implement
208C<UNIVERSAL::DOES>.
f742dfef 209
080e3614 210=item B<< $object->dump($maxdepth) >>
f742dfef 211
080e3614 212This is a handy utility for C<Data::Dumper>ing an object. By default,
213the maximum depth is 1, to avoid making a mess.
f742dfef 214
fcd84ca9 215=back
216
217=head1 BUGS
218
d4048ef3 219See L<Moose/BUGS> for details on reporting bugs.
fcd84ca9 220
fcd84ca9 221=head1 AUTHOR
222
223Stevan Little E<lt>stevan@iinteractive.comE<gt>
224
225=head1 COPYRIGHT AND LICENSE
226
7e0492d3 227Copyright 2006-2010 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