r63972 - in /trunk/libclass-mop-perl: ./ debian/ lib/ lib/Class/ lib/Class/MOP/ lib/Class/MOP/Class/Immutable/ lib/Class/MOP/Method/ lib/Class/MOP/Mixin/ t/

angelabad-guest at users.alioth.debian.org angelabad-guest at users.alioth.debian.org
Tue Oct 19 00:05:40 UTC 2010


Author: angelabad-guest
Date: Tue Oct 19 00:05:06 2010
New Revision: 63972

URL: http://svn.debian.org/wsvn/pkg-perl/?sc=1&rev=63972
Log:
New upstream release

Modified:
    trunk/libclass-mop-perl/Changes
    trunk/libclass-mop-perl/META.yml
    trunk/libclass-mop-perl/README
    trunk/libclass-mop-perl/debian/changelog
    trunk/libclass-mop-perl/debian/copyright
    trunk/libclass-mop-perl/lib/Class/MOP.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Attribute.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Class.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Class/Immutable/Trait.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Deprecated.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Instance.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Accessor.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Constructor.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Generated.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Inlined.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Meta.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Method/Wrapped.pm
    trunk/libclass-mop-perl/lib/Class/MOP/MiniTrait.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Mixin.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Mixin/AttributeCore.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasAttributes.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasMethods.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Module.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Object.pm
    trunk/libclass-mop-perl/lib/Class/MOP/Package.pm
    trunk/libclass-mop-perl/lib/metaclass.pm
    trunk/libclass-mop-perl/t/010_self_introspection.t
    trunk/libclass-mop-perl/t/048_anon_class_create_init.t

Modified: trunk/libclass-mop-perl/Changes
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/Changes?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/Changes (original)
+++ trunk/libclass-mop-perl/Changes Tue Oct 19 00:05:06 2010
@@ -1,4 +1,8 @@
 Revision history for Perl extension Class-MOP.
+
+1.10 Mon, Oct 18, 2010
+
+  * Lots of fixes for edge cases with anon classes. (doy)
 
 1.09 Tue, Oct 5, 2010
 

Modified: trunk/libclass-mop-perl/META.yml
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/META.yml?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/META.yml (original)
+++ trunk/libclass-mop-perl/META.yml Tue Oct 19 00:05:06 2010
@@ -39,5 +39,5 @@
 resources:
   license: http://dev.perl.org/licenses/
   repository: git://git.moose.perl.org/Class-MOP.git
-version: 1.09
+version: 1.10
 x_authority: cpan:STEVAN

Modified: trunk/libclass-mop-perl/README
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/README?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/README (original)
+++ trunk/libclass-mop-perl/README Tue Oct 19 00:05:06 2010
@@ -1,4 +1,4 @@
-Class::MOP version 1.09
+Class::MOP version 1.10
 ===========================
 
 See the individual module documentation for more information

Modified: trunk/libclass-mop-perl/debian/changelog
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/debian/changelog?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/debian/changelog (original)
+++ trunk/libclass-mop-perl/debian/changelog Tue Oct 19 00:05:06 2010
@@ -1,3 +1,9 @@
+libclass-mop-perl (1.10-1) unstable; urgency=low
+
+  * New upstream release
+
+ -- Angel Abad <angelabad at gmail.com>  Tue, 19 Oct 2010 02:01:26 +0200
+
 libclass-mop-perl (1.09-2) UNRELEASED; urgency=low
 
   * Update my email address.

Modified: trunk/libclass-mop-perl/debian/copyright
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/debian/copyright?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/debian/copyright (original)
+++ trunk/libclass-mop-perl/debian/copyright Tue Oct 19 00:05:06 2010
@@ -29,8 +29,8 @@
  2009-2010, Jonathan Yu <jawnsy at cpan.org>
  2009, Antonio Radici <antonio at dyne.org>
  2009, Ryan Niebur <ryanryan52 at gmail.com>
- 2009, Salvatore Bonaccorso <carnil at debian.org>
  2010, Angel Abad <angelabad at gmail.com>
+ 2009-2010, Salvatore Bonaccorso <carnil at debian.org>
 License: Artistic or GPL-1+
 
 License: Artistic

Modified: trunk/libclass-mop-perl/lib/Class/MOP.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP.pm Tue Oct 19 00:05:06 2010
@@ -9,7 +9,7 @@
 use MRO::Compat;
 
 use Carp          'confess';
-use Scalar::Util  'weaken', 'reftype', 'blessed';
+use Scalar::Util  'weaken', 'isweak', 'reftype', 'blessed';
 use Data::OptList;
 use Try::Tiny;
 
@@ -29,7 +29,7 @@
     *check_package_cache_flag = \&mro::get_pkg_gen;
 }
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 our $XS_VERSION = $VERSION;
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
@@ -51,6 +51,7 @@
     sub get_metaclass_by_name       { $METAS{$_[0]}         }
     sub store_metaclass_by_name     { $METAS{$_[0]} = $_[1] }
     sub weaken_metaclass            { weaken($METAS{$_[0]}) }
+    sub metaclass_is_weak           { isweak($METAS{$_[0]}) }
     sub does_metaclass_exist        { exists $METAS{$_[0]} && defined $METAS{$_[0]} }
     sub remove_metaclass_by_name    { delete $METAS{$_[0]}; return }
 
@@ -1068,6 +1069,11 @@
 function will weaken the reference to the metaclass stored
 in C<$name>.
 
+=item B<Class::MOP::metaclass_is_weak($name)>
+
+Returns true if the metaclass for C<$name> has been weakened
+(via C<weaken_metaclass>).
+
 =item B<Class::MOP::does_metaclass_exist($name)>
 
 This will return true of there exists a metaclass stored in the

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Attribute.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Attribute.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Attribute.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Attribute.pm Tue Oct 19 00:05:06 2010
@@ -10,7 +10,7 @@
 use Scalar::Util 'blessed', 'weaken';
 use Try::Tiny;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Class.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Class.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Class.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Class.pm Tue Oct 19 00:05:06 2010
@@ -17,7 +17,7 @@
 use Try::Tiny;
 use List::MoreUtils 'all';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -53,9 +53,13 @@
     my $old_metaclass = blessed($options{package})
         ? $options{package}
         : Class::MOP::get_metaclass_by_name($options{package});
+    $options{weaken} = Class::MOP::metaclass_is_weak($old_metaclass->name)
+        if !exists $options{weaken}
+        && blessed($old_metaclass)
+        && $old_metaclass->isa('Class::MOP::Class');
     $old_metaclass->_remove_generated_metaobjects
         if $old_metaclass && $old_metaclass->isa('Class::MOP::Class');
-    my $new_metaclass = $class->SUPER::reinitialize(@args);
+    my $new_metaclass = $class->SUPER::reinitialize(%options);
     $new_metaclass->_restore_metaobjects_from($old_metaclass)
         if $old_metaclass && $old_metaclass->isa('Class::MOP::Class');
     return $new_metaclass;
@@ -109,7 +113,7 @@
     # NOTE:
     # we need to weaken any anon classes
     # so that they can call DESTROY properly
-    Class::MOP::weaken_metaclass($package_name) if $meta->is_anon_class;
+    Class::MOP::weaken_metaclass($package_name) if $options->{weaken};
 
     $meta;
 }
@@ -444,6 +448,7 @@
 
     sub create_anon_class {
         my ($class, %options) = @_;
+        $options{weaken} = 1 unless exists $options{weaken};
         my $package_name = $ANON_CLASS_PREFIX . ++$ANON_CLASS_SERIAL;
         return $class->create($package_name, %options);
     }
@@ -597,17 +602,8 @@
     foreach my $attr ($class->get_all_attributes()) {
         $attr->initialize_instance_slot($meta_instance, $instance, $params);
     }
-    # NOTE:
-    # this will only work for a HASH instance type
-    if ($class->is_anon_class) {
-        (reftype($instance) eq 'HASH')
-            || confess "Currently only HASH based instances are supported with instance of anon-classes";
-        # NOTE:
-        # At some point we should make this official
-        # as a reserved slot name, but right now I am
-        # going to keep it here.
-        # my $RESERVED_MOP_SLOT = '__MOP__';
-        $instance->{'__MOP__'} = $class;
+    if (Class::MOP::metaclass_is_weak($class->name)) {
+        $meta_instance->_set_mop_slot($instance, $class);
     }
     return $instance;
 }
@@ -642,6 +638,24 @@
     my $self = shift;
 
     return $self->get_meta_instance->inline_rebless_instance_structure(@_);
+}
+
+sub _inline_get_mop_slot {
+    my $self = shift;
+
+    return $self->get_meta_instance->_inline_get_mop_slot(@_);
+}
+
+sub _inline_set_mop_slot {
+    my $self = shift;
+
+    return $self->get_meta_instance->_inline_set_mop_slot(@_);
+}
+
+sub _inline_clear_mop_slot {
+    my $self = shift;
+
+    return $self->get_meta_instance->_inline_clear_mop_slot(@_);
 }
 
 sub clone_object {
@@ -683,11 +697,19 @@
 
     my $meta_instance = $self->get_meta_instance;
 
+    if (Class::MOP::metaclass_is_weak($old_metaclass->name)) {
+        $meta_instance->_clear_mop_slot($instance);
+    }
+
     # rebless!
     # we use $_[1] here because of t/306_rebless_overload.t regressions on 5.8.8
     $meta_instance->rebless_instance_structure($_[1], $self);
 
     $self->_fixup_attributes_after_rebless($instance, $old_metaclass, %params);
+
+    if (Class::MOP::metaclass_is_weak($self->name)) {
+        $meta_instance->_set_mop_slot($instance, $self);
+    }
 }
 
 sub rebless_instance {
@@ -842,6 +864,16 @@
 sub _superclasses_updated {
     my $self = shift;
     $self->update_meta_instance_dependencies();
+    # keep strong references to all our parents, so they don't disappear if
+    # they are anon classes and don't have any direct instances
+    $self->_superclass_metas(
+        map { Class::MOP::class_of($_) } $self->superclasses
+    );
+}
+
+sub _superclass_metas {
+    my $self = shift;
+    $self->{_superclass_metas} = [@_];
 }
 
 sub subclasses {
@@ -1446,6 +1478,21 @@
 If it is not passed, C<meta> is assumed, and if C<undef> is explicitly
 given, no meta method will be installed.
 
+=item * weaken
+
+If true, the metaclass that is stored in the global cache will be a
+weak reference.
+
+Classes created in this way are destroyed once the metaclass they are
+attached to goes out of scope, and will be removed from Perl's internal
+symbol table.
+
+All instances of a class with a weakened metaclass keep a special
+reference to the metaclass object, which prevents the metaclass from
+going out of scope while any instances exist.
+
+This only works if the instance is based on a hash reference, however.
+
 =back
 
 =item B<< Class::MOP::Class->create_anon_class(%options) >>
@@ -1457,15 +1504,8 @@
 It accepts the same C<superclasses>, C<methods>, and C<attributes>
 parameters that C<create> accepts.
 
-Anonymous classes are destroyed once the metaclass they are attached
-to goes out of scope, and will be removed from Perl's internal symbol
-table.
-
-All instances of an anonymous class keep a special reference to the
-metaclass object, which prevents the metaclass from going out of scope
-while any instances exist.
-
-This only works if the instance is based on a hash reference, however.
+Anonymous classes default to C<< weaken => 1 >>, although this can be
+overridden.
 
 =item B<< Class::MOP::Class->initialize($package_name, %options) >>
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Class/Immutable/Trait.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Class/Immutable/Trait.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Class/Immutable/Trait.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Class/Immutable/Trait.pm Tue Oct 19 00:05:06 2010
@@ -8,7 +8,7 @@
 use Carp 'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Deprecated.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Deprecated.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Deprecated.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Deprecated.pm Tue Oct 19 00:05:06 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '1.09';
+our $VERSION = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Instance.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Instance.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Instance.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Instance.pm Tue Oct 19 00:05:06 2010
@@ -6,11 +6,14 @@
 
 use Scalar::Util 'weaken', 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
 use base 'Class::MOP::Object';
+
+# make this not a valid method name, to avoid (most) attribute conflicts
+my $RESERVED_MOP_SLOT = '<<MOP>>';
 
 sub BUILDARGS {
     my ($class, @args) = @_;
@@ -161,6 +164,21 @@
     return; # for meta instances that require updates on inherited slot changes
 }
 
+sub _get_mop_slot {
+    my ($self, $instance) = @_;
+    $self->get_slot_value($instance, $RESERVED_MOP_SLOT);
+}
+
+sub _set_mop_slot {
+    my ($self, $instance, $value) = @_;
+    $self->set_slot_value($instance, $RESERVED_MOP_SLOT, $value);
+}
+
+sub _clear_mop_slot {
+    my ($self, $instance) = @_;
+    $self->deinitialize_slot($instance, $RESERVED_MOP_SLOT);
+}
+
 # inlinable operation snippets
 
 sub is_inlinable { 1 }
@@ -175,6 +193,8 @@
     sprintf q[%s->{"%s"}], $instance, quotemeta($slot_name);
 }
 
+sub inline_get_is_lvalue { 1 }
+
 sub inline_get_slot_value {
     my ($self, $instance, $slot_name) = @_;
     $self->inline_slot_access($instance, $slot_name);
@@ -212,6 +232,21 @@
 sub inline_rebless_instance_structure {
     my ($self, $instance, $class_variable) = @_;
     "bless $instance => $class_variable";
+}
+
+sub _inline_get_mop_slot {
+    my ($self, $instance) = @_;
+    $self->inline_get_slot_value($instance, $RESERVED_MOP_SLOT);
+}
+
+sub _inline_set_mop_slot {
+    my ($self, $instance, $value) = @_;
+    $self->inline_set_slot_value($instance, $RESERVED_MOP_SLOT, $value);
+}
+
+sub _inline_clear_mop_slot {
+    my ($self, $instance) = @_;
+    $self->inline_deinitialize_slot($instance, $RESERVED_MOP_SLOT);
 }
 
 1;
@@ -360,6 +395,11 @@
 It returns a snippet of code that creates a new object for the
 class. This is something like C< bless {}, $class_name >.
 
+=item B<< $metainstance->inline_get_is_lvalue >>
+
+Returns whether or not C<inline_get_slot_value> is a valid lvalue. This can be
+used to do extra optimizations when generating inlined methods.
+
 =item B<< $metainstance->inline_slot_access($instance_variable, $slot_name) >>
 
 =item B<< $metainstance->inline_get_slot_value($instance_variable, $slot_name) >>

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'weaken', 'reftype', 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Accessor.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Accessor.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Accessor.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Accessor.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Constructor.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Constructor.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Constructor.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Constructor.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 
@@ -114,6 +114,9 @@
     $source .= ";\n" . (join ";\n" => map {
         $self->_generate_slot_initializer($_, $idx++)
     } @{ $self->_attributes });
+    if (Class::MOP::metaclass_is_weak($self->associated_metaclass->name)) {
+        $source .= ";\n" . $self->associated_metaclass->_inline_set_mop_slot('$instance', 'Class::MOP::class_of($class)');
+    }
     $source .= ";\n" . 'return $instance';
     $source .= ";\n" . '}';
     warn $source if $self->options->{debug};

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Generated.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Generated.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Generated.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Generated.pm Tue Oct 19 00:05:06 2010
@@ -6,7 +6,7 @@
 
 use Carp 'confess';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Inlined.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Inlined.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Inlined.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Inlined.pm Tue Oct 19 00:05:06 2010
@@ -6,7 +6,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed', 'weaken', 'looks_like_number', 'refaddr';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Meta.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Meta.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Meta.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Meta.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Method/Wrapped.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Method/Wrapped.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Method/Wrapped.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Method/Wrapped.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/MiniTrait.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/MiniTrait.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/MiniTrait.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/MiniTrait.pm Tue Oct 19 00:05:06 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-our $VERSION = '1.09';
+our $VERSION = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Mixin.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Mixin.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Mixin.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Mixin.pm Tue Oct 19 00:05:06 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Mixin/AttributeCore.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Mixin/AttributeCore.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Mixin/AttributeCore.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Mixin/AttributeCore.pm Tue Oct 19 00:05:06 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasAttributes.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasAttributes.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasAttributes.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasAttributes.pm Tue Oct 19 00:05:06 2010
@@ -3,7 +3,7 @@
 use strict;
 use warnings;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasMethods.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasMethods.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasMethods.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Mixin/HasMethods.pm Tue Oct 19 00:05:06 2010
@@ -5,7 +5,7 @@
 
 use Class::MOP::Method::Meta;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Module.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Module.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Module.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Module.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp         'confess';
 use Scalar::Util 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Object.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Object.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Object.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Object.pm Tue Oct 19 00:05:06 2010
@@ -7,7 +7,7 @@
 use Carp qw(confess);
 use Scalar::Util 'blessed';
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/Class/MOP/Package.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/Class/MOP/Package.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/Class/MOP/Package.pm (original)
+++ trunk/libclass-mop-perl/lib/Class/MOP/Package.pm Tue Oct 19 00:05:06 2010
@@ -8,7 +8,7 @@
 use Carp         'confess';
 use Package::Stash;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/lib/metaclass.pm
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/lib/metaclass.pm?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/lib/metaclass.pm (original)
+++ trunk/libclass-mop-perl/lib/metaclass.pm Tue Oct 19 00:05:06 2010
@@ -8,7 +8,7 @@
 use Scalar::Util 'blessed';
 use Try::Tiny;
 
-our $VERSION   = '1.09';
+our $VERSION   = '1.10';
 $VERSION = eval $VERSION;
 our $AUTHORITY = 'cpan:STEVAN';
 

Modified: trunk/libclass-mop-perl/t/010_self_introspection.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/t/010_self_introspection.t?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/t/010_self_introspection.t (original)
+++ trunk/libclass-mop-perl/t/010_self_introspection.t Tue Oct 19 00:05:06 2010
@@ -63,6 +63,7 @@
     instance_metaclass get_meta_instance
     inline_create_instance
     inline_rebless_instance
+    _inline_get_mop_slot _inline_set_mop_slot _inline_clear_mop_slot
     create_meta_instance _create_meta_instance
     new_object clone_object
     construct_instance _construct_instance
@@ -87,7 +88,7 @@
     invalidate_meta_instances invalidate_meta_instance
 
     superclasses subclasses direct_subclasses class_precedence_list
-    linearized_isa _superclasses_updated
+    linearized_isa _superclasses_updated _superclass_metas
 
     alias_method get_all_method_names get_all_methods compute_all_applicable_methods
         find_method_by_name find_all_methods_by_name find_next_method_by_name

Modified: trunk/libclass-mop-perl/t/048_anon_class_create_init.t
URL: http://svn.debian.org/wsvn/pkg-perl/trunk/libclass-mop-perl/t/048_anon_class_create_init.t?rev=63972&op=diff
==============================================================================
--- trunk/libclass-mop-perl/t/048_anon_class_create_init.t (original)
+++ trunk/libclass-mop-perl/t/048_anon_class_create_init.t Tue Oct 19 00:05:06 2010
@@ -2,6 +2,7 @@
 use warnings;
 
 use Test::More;
+use Test::Exception;
 
 use Class::MOP;
 
@@ -18,7 +19,132 @@
 
 }
 
-my $anon = MyMeta->create_anon_class( foo => 'this' );
-isa_ok( $anon, 'MyMeta' );
+{
+    my $anon = MyMeta->create_anon_class( foo => 'this' );
+    isa_ok( $anon, 'MyMeta' );
+}
+
+my $instance;
+
+{
+    my $meta = Class::MOP::Class->create_anon_class;
+    $instance = $meta->new_object;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "anon class is kept alive by existing instances");
+
+    undef $instance;
+    ok(!$meta, "anon class is collected once instances go away");
+}
+
+{
+    my $meta = Class::MOP::Class->create_anon_class;
+    $meta->make_immutable;
+    $instance = $meta->name->new;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "anon class is kept alive by existing instances (immutable)");
+
+    undef $instance;
+    ok(!$meta, "anon class is collected once instances go away (immutable)");
+}
+
+{
+    $instance = Class::MOP::Class->create('Foo')->new_object;
+    my $meta = Class::MOP::Class->create_anon_class(superclasses => ['Foo']);
+    $meta->rebless_instance($instance);
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "anon class is kept alive by existing instances");
+
+    undef $instance;
+    ok(!$meta, "anon class is collected once instances go away");
+}
+
+{
+    {
+        my $meta = Class::MOP::Class->create_anon_class;
+        {
+            my $submeta = Class::MOP::Class->create_anon_class(
+                superclasses => [$meta->name]
+            );
+            $instance = $submeta->new_object;
+        }
+        {
+            my $submeta = Class::MOP::class_of($instance);
+            Scalar::Util::weaken($submeta);
+            ok($submeta, "anon class is kept alive by existing instances");
+
+            $meta->rebless_instance_back($instance);
+            ok(!$submeta, "reblessing away loses the metaclass");
+        }
+    }
+
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "anon class is kept alive by existing instances");
+}
+
+{
+    my $submeta = Class::MOP::Class->create_anon_class(
+        superclasses => [Class::MOP::Class->create_anon_class->name],
+    );
+    my @superclasses = $submeta->superclasses;
+    ok(Class::MOP::class_of($superclasses[0]),
+       "superclasses are kept alive by their subclasses");
+}
+
+{
+    my $meta_name;
+    {
+        my $meta = Class::MOP::Class->create_anon_class(
+            superclasses => ['Class::MOP::Class'],
+        );
+        $meta_name = $meta->name;
+        ok(Class::MOP::metaclass_is_weak($meta_name),
+           "default is for anon metaclasses to be weakened");
+    }
+    ok(!Class::MOP::class_of($meta_name),
+       "and weak metaclasses go away when all refs do");
+    {
+        my $meta = Class::MOP::Class->create_anon_class(
+            superclasses => ['Class::MOP::Class'],
+            weaken => 0,
+        );
+        $meta_name = $meta->name;
+        ok(!Class::MOP::metaclass_is_weak($meta_name),
+           "anon classes can be told not to weaken");
+    }
+    ok(Class::MOP::class_of($meta_name), "metaclass still exists");
+    {
+        my $bar_meta;
+        lives_ok {
+            $bar_meta = $meta_name->initialize('Bar');
+        } "we can use the name on its own";
+        isa_ok($bar_meta, $meta_name);
+    }
+}
+
+{
+    my $meta = Class::MOP::Class->create(
+        'Baz',
+        weaken => 1,
+    );
+    $instance = $meta->new_object;
+}
+{
+    my $meta = Class::MOP::class_of($instance);
+    Scalar::Util::weaken($meta);
+    ok($meta, "weak class is kept alive by existing instances");
+
+    undef $instance;
+    ok(!$meta, "weak class is collected once instances go away");
+}
 
 done_testing;




More information about the Pkg-perl-cvs-commits mailing list