Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
attr_accessor_with_default rewrite to allow alias_method
From 781092971105c6f31394978fef51ac4236146ff6 Mon Sep 17 00:00:00 2001
From: Benjamin Huber <benjamin@rubberandglue.at>
Date: Sun, 12 Dec 2010 17:51:02 +0100
Subject: [PATCH] attr_accessor_with_default rewrite to allow alias_method [#6099 state:resolved tagged:patch]
---
.../core_ext/module/attr_accessor_with_default.rb | 14 +++++++++-----
.../module/attr_accessor_with_default_test.rb | 8 ++++++++
2 files changed, 17 insertions(+), 5 deletions(-)
diff --git a/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb b/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb
index 0b67318..93cece1 100644
--- a/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb
+++ b/activesupport/lib/active_support/core_ext/module/attr_accessor_with_default.rb
@@ -19,12 +19,16 @@ class Module
# attr_accessor_with_default(:element_name) { name.underscore }
#
def attr_accessor_with_default(sym, default = Proc.new)
- define_method(sym, block_given? ? default : Proc.new { default })
+ define_method("#{sym}_default", block_given? ? default : Proc.new { default })
module_eval(<<-EVAL, __FILE__, __LINE__ + 1)
- def #{sym}=(value) # def age=(value)
- class << self; attr_accessor :#{sym} end # class << self; attr_accessor :age end
- @#{sym} = value # @age = value
- end # end
+ def #{sym} # def age
+ (@#{sym}_marked ||= false) ? @#{sym} : #{sym}_default # (@age_marked ||= false) ? @age : age_default
+ end # end
+
+ def #{sym}=(value) # def age=(value)
+ @#{sym}_marked = true # @age_marked = true
+ @#{sym} = value # @age = value
+ end # end
EVAL
end
end
diff --git a/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb b/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb
index b9b60c4..911f9ab 100644
--- a/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb
+++ b/activesupport/test/core_ext/module/attr_accessor_with_default_test.rb
@@ -25,6 +25,14 @@ class AttrAccessorWithDefaultTest < Test::Unit::TestCase
assert_nil(@instance.foo)
end
+ def test_with_aliased_method
+ @target.attr_accessor_with_default :bla, false
+ @target.send :alias_method, :bla?, :bla
+ assert_equal(false, @instance.bla?)
+ @instance.bla = nil
+ assert_nil @instance.bla?
+ end
+
def test_invalid_args
assert_raise(ArgumentError) {@target.attr_accessor_with_default :foo}
end
--
1.7.3.2
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment