make the 'reset' delegation for Counter respect builders
Jesse Luehrs [Sun, 24 Apr 2011 19:36:07 +0000 (14:36 -0500)]
Changes
lib/Moose/Meta/Method/Accessor/Native/Counter/reset.pm
t/native_traits/trait_counter.t

diff --git a/Changes b/Changes
index 9dc34ef..af30c84 100644 (file)
--- a/Changes
+++ b/Changes
@@ -14,6 +14,9 @@ for, noteworthy changes.
 
   * Stop hiding warnings produced by throwing errors in DEMOLISH methods.
 
+  * The 'reset' native delegation for Counter attributes will now also respect
+    builders (previously, it only respected defaults).
+
 2.0001 Fri, Apr 22, 2011
 
   [ENHANCEMENTS]
index 36319ee..4689c51 100644 (file)
@@ -20,14 +20,21 @@ sub _potential_value {
     my $self = shift;
     my ($slot_access) = @_;
 
-    return '$attr->default($self)';
+    my $attr = $self->associated_attribute;
+
+    return '(do { '
+             . join(' ', $attr->_inline_generate_default(
+                   '$self', '$default_for_reset'
+               )) . ' '
+             . '$default_for_reset; '
+         . '})';
 }
 
 sub _inline_optimized_set_new_value {
     my $self = shift;
     my ($inv, $new, $slot_access) = @_;
 
-    return $slot_access . ' = $attr->default($self);';
+    return $slot_access . ' = ' . $self->_potential_value . ';';
 }
 
 no Moose::Role;
index ad2e70d..a314755 100644 (file)
@@ -132,4 +132,41 @@ sub run_tests {
     $class;
 }
 
+{
+    package WithBuilder;
+    use Moose;
+
+    has nonlazy => (
+        traits  => ['Counter'],
+        is      => 'rw',
+        isa     => 'Int',
+        builder => '_builder',
+        handles => {
+            reset_nonlazy => 'reset',
+        },
+    );
+
+    has lazy => (
+        traits  => ['Counter'],
+        is      => 'rw',
+        isa     => 'Int',
+        lazy    => 1,
+        builder => '_builder',
+        handles => {
+            reset_lazy => 'reset',
+        },
+    );
+
+    sub _builder { 1 }
+}
+
+for my $attr ('lazy', 'nonlazy') {
+    my $obj = WithBuilder->new;
+    is($obj->$attr, 1, "built properly");
+    $obj->$attr(0);
+    is($obj->$attr, 0, "can be manually set");
+    $obj->${\"reset_$attr"};
+    is($obj->$attr, 1, "reset resets it to its default value");
+}
+
 done_testing;