X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMoose%2FMeta%2FMethod%2FDestructor.pm;h=610898d9b837055e5eedcdad491511ba38ff1519;hb=a3319906531cef2b41a87138e75461ced7a3394b;hp=a6f4f65971e87be1c782719629ba513751a3f786;hpb=eaa35e6e0f9132abf6ed0cec60515dd7259ce704;p=gitmo%2FMoose.git diff --git a/lib/Moose/Meta/Method/Destructor.pm b/lib/Moose/Meta/Method/Destructor.pm index a6f4f65..610898d 100644 --- a/lib/Moose/Meta/Method/Destructor.pm +++ b/lib/Moose/Meta/Method/Destructor.pm @@ -4,10 +4,10 @@ package Moose::Meta::Method::Destructor; use strict; use warnings; -use Carp 'confess'; use Scalar::Util 'blessed', 'weaken'; -our $VERSION = '0.50'; +our $VERSION = '0.73_01'; +$VERSION = eval $VERSION; our $AUTHORITY = 'cpan:STEVAN'; use base 'Moose::Meta::Method', @@ -17,26 +17,26 @@ sub new { my $class = shift; my %options = @_; - (exists $options{options} && ref $options{options} eq 'HASH') - || confess "You must pass a hash of options"; - + (ref $options{options} eq 'HASH') + || $class->throw_error("You must pass a hash of options", data => $options{options}); + ($options{package_name} && $options{name}) - || confess "You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT"; - + || $class->throw_error("You must supply the package_name and name parameters $Class::MOP::Method::UPGRADE_ERROR_TEXT"); + my $self = bless { # from our superclass - '&!body' => undef, - '$!package_name' => $options{package_name}, - '$!name' => $options{name}, + 'body' => undef, + 'package_name' => $options{package_name}, + 'name' => $options{name}, # ... - '%!options' => $options{options}, - '$!associated_metaclass' => $options{metaclass}, + 'options' => $options{options}, + 'associated_metaclass' => $options{metaclass}, } => $class; # we don't want this creating # a cycle in the code, if not # needed - weaken($self->{'$!associated_metaclass'}); + weaken($self->{'associated_metaclass'}); $self->initialize_body; @@ -45,21 +45,19 @@ sub new { ## accessors -sub options { (shift)->{'%!options'} } -sub associated_metaclass { (shift)->{'$!associated_metaclass'} } +sub options { (shift)->{'options'} } ## method -sub is_needed { - my $self = shift; - # if called as a class method - # then must pass in a class name - unless (blessed $self) { - (blessed $_[0] && $_[0]->isa('Class::MOP::Class')) - || confess "When calling is_needed as a class method you must pass a class name"; - return $_[0]->meta->can('DEMOLISH'); - } - defined $self->{'&!body'} ? 1 : 0 +sub is_needed { + my $self = shift; + my $metaclass = shift; + + ( blessed $metaclass && $metaclass->isa('Class::MOP::Class') ) + || $self->throw_error( + "The is_needed method expected a metaclass object as its arugment"); + + return Class::MOP::class_of($metaclass)->can('DEMOLISH'); } sub initialize_body { @@ -88,12 +86,12 @@ sub initialize_body { $source .= ";\n" . '}'; warn $source if $self->options->{debug}; - my $code; - { - $code = eval $source; - confess "Could not eval the destructor :\n\n$source\n\nbecause :\n\n$@" if $@; - } - $self->{'&!body'} = $code; + my $code = $self->_compile_code( + environment => {}, + code => $source, + ) or $self->throw_error("Could not eval the destructor :\n\n$source\n\nbecause :\n\n$@", error => $@, data => $source); + + $self->{'body'} = $code; } @@ -109,28 +107,49 @@ Moose::Meta::Method::Destructor - Method Meta Object for destructors =head1 DESCRIPTION -This is a subclass of L which handles -constructing an approprate Destructor method. This is primarily -used in the making of immutable metaclasses, otherwise it is -not particularly useful. +This class is a subclass of L that +provides Moose-specific functionality for inlining destructors. + +To understand this class, you should read the the +L documentation as well. + +=head1 INHERITANCE + +C is a subclass of +L I L. =head1 METHODS =over 4 -=item B +=item B<< Moose::Meta;:Method::Destructor->new(%options) >> + +This constructs a new object. It accepts the following options: + +=over 8 -=item B +=item * package_name -=item B +The package for the class in which the destructor is being +inlined. This option is required. -=item B +=item * name -=item B +The name of the destructor method. This option is required. + +=item * metaclass + +The metaclass for the class this destructor belongs to. This is +optional, as it can be set later by calling C<< +$metamethod->attach_to_class >>. + +=back -=item B +=item B<< Moose::Meta;:Method::Destructor->is_needed($metaclass) >> -=item B +Given a L object, this method returns a boolean +indicating whether the class needs a destructor. If the class or any +of its parents defines a C method, it needs a destructor. =back @@ -140,7 +159,7 @@ Stevan Little Estevan@iinteractive.comE =head1 COPYRIGHT AND LICENSE -Copyright 2006-2008 by Infinity Interactive, Inc. +Copyright 2006-2009 by Infinity Interactive, Inc. L