7 use Devel::GlobalDestruction ();
12 use if ( not our $__mx_is_compiled ), 'Moose::Meta::Class';
13 use if ( not our $__mx_is_compiled ), metaclass => 'Moose::Meta::Class';
15 our $VERSION = '0.94';
16 $VERSION = eval $VERSION;
17 our $AUTHORITY = 'cpan:STEVAN';
22 my $params = $class->BUILDARGS(@_);
24 my $real_class = Scalar::Util::blessed($class) || $class;
25 my $self = Class::MOP::Class->initialize($real_class)->new_object($params);
27 $self->BUILDALL($params);
34 if ( scalar @_ == 1 ) {
35 unless ( defined $_[0] && ref $_[0] eq 'HASH' ) {
36 Class::MOP::class_of($class)->throw_error(
37 "Single parameters to new() must be a HASH ref",
40 return { %{ $_[0] } };
48 # NOTE: we ask Perl if we even
49 # need to do this first, to avoid
50 # extra meta level calls
51 return if $_[0]->can('BUILD') == \&BUILD;
52 my ($self, $params) = @_;
53 foreach my $method (reverse Class::MOP::class_of($self)->find_all_methods_by_name('BUILD')) {
54 next if $method->{class} eq __PACKAGE__;
55 $method->{code}->execute($self, $params);
63 my ($in_global_destruction) = @_;
65 # NOTE: we ask Perl if we even
66 # need to do this first, to avoid
67 # extra meta level calls
68 return if $self->can('DEMOLISH') == \&DEMOLISH;
71 if ( my $meta = Class::MOP::class_of($self ) ) {
72 @isa = $meta->linearized_isa;
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) }
82 foreach my $class (@isa) {
84 next if $class eq __PACKAGE__;
85 my $demolish = *{"${class}::DEMOLISH"}{CODE};
86 $self->$demolish($in_global_destruction)
99 $self->DEMOLISHALL(Devel::GlobalDestruction::in_global_destruction);
102 # Without this, Perl will warn "\t(in cleanup)$@" because of some
103 # bizarre fucked-up logic deep in the internals.
111 # support for UNIVERSAL::DOES ...
113 my $does = UNIVERSAL->can("DOES") ? "SUPER::DOES" : "isa";
115 my ( $self, $class_or_role_name ) = @_;
116 return $self->'.$does.'($class_or_role_name)
117 || $self->does($class_or_role_name);
121 # new does() methods will be created
122 # as appropiate see Moose::Meta::Role
124 my ($self, $role_name) = @_;
125 my $meta = Class::MOP::class_of($self);
127 || $meta->throw_error("You must supply a role name to does()");
128 return 1 if $meta->can('does_role') && $meta->does_role($role_name);
134 require Data::Dumper;
135 local $Data::Dumper::Maxdepth = shift if @_;
136 Data::Dumper::Dumper $self;
147 Moose::Object - The base object for Moose
151 This class is the default base class for all Moose-using classes. When
152 you C<use Moose> in this class, your class will inherit from this
155 It provides a default constructor and destructor, which run the
156 C<BUILDALL> and C<DEMOLISHALL> methods respectively.
158 You don't actually I<need> to inherit from this in order to use Moose,
159 but it makes it easier to take advantage of all of Moose's features.
165 =item B<< Moose::Object->new(%params) >>
167 This method calls C<< $class->BUILDARGS(@_) >>, and then creates a new
168 instance of the appropriate class. Once the instance is created, it
169 calls C<< $instance->BUILDALL($params) >>.
171 =item B<< Moose::Object->BUILDARGS(%params) >>
173 The default implementation of this method accepts a hash or hash
174 reference of named parameters. If it receives a single argument that
175 I<isn't> a hash reference it throws an error.
177 You can override this method in your class to handle other types of
178 options passed to the constructor.
180 This method should always return a hash reference of named options.
182 =item B<< $object->BUILDALL($params) >>
184 This method will call every C<BUILD> method in the inheritance
185 hierarchy, starting with the most distant parent class and ending with
188 The C<BUILD> method will be passed the hash reference returned by
191 =item B<< $object->DEMOLISHALL >>
193 This will call every C<DEMOLISH> method in the inheritance hierarchy,
194 starting with the object's class and ending with the most distant
195 parent. C<DEMOLISHALL> and C<DEMOLISH> will receive a boolean
196 indicating whether or not we are currently in global destruction.
198 =item B<< $object->does($role_name) >>
200 This returns true if the object does the given role.
202 =item B<DOES ($class_or_role_name)>
204 This is a a Moose role-aware implementation of L<UNIVERSAL/DOES>.
206 This is effectively the same as writing:
208 $object->does($name) || $object->isa($name)
210 This method will work with Perl 5.8, which did not implement
213 =item B<< $object->dump($maxdepth) >>
215 This is a handy utility for C<Data::Dumper>ing an object. By default,
216 the maximum depth is 1, to avoid making a mess.
222 See L<Moose/BUGS> for details on reporting bugs.
226 Stevan Little E<lt>stevan@iinteractive.comE<gt>
228 =head1 COPYRIGHT AND LICENSE
230 Copyright 2006-2010 by Infinity Interactive, Inc.
232 L<http://www.iinteractive.com>
234 This library is free software; you can redistribute it and/or modify
235 it under the same terms as Perl itself.