aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport
diff options
context:
space:
mode:
authorNick <nick@nicksieger.com>2008-04-19 10:18:02 -0500
committerNick Sieger <nick@nicksieger.com>2008-08-29 14:12:09 -0500
commit9dc4f6611043d032e576d93430cd29efc8864bc4 (patch)
tree69473e5bbc8a4059a94c55ddac4eacb45180c1ca /activesupport
parent3eb68248e0c0495c4533792260c9262fcd2840af (diff)
downloadrails-9dc4f6611043d032e576d93430cd29efc8864bc4.tar.gz
rails-9dc4f6611043d032e576d93430cd29efc8864bc4.tar.bz2
rails-9dc4f6611043d032e576d93430cd29efc8864bc4.zip
Add method punctuation handling to #synchronize
Diffstat (limited to 'activesupport')
-rw-r--r--activesupport/lib/active_support/core_ext/module/synchronization.rb8
-rw-r--r--activesupport/test/core_ext/module/synchronization_test.rb14
2 files changed, 19 insertions, 3 deletions
diff --git a/activesupport/lib/active_support/core_ext/module/synchronization.rb b/activesupport/lib/active_support/core_ext/module/synchronization.rb
index bf7740f851..c55a3f07ee 100644
--- a/activesupport/lib/active_support/core_ext/module/synchronization.rb
+++ b/activesupport/lib/active_support/core_ext/module/synchronization.rb
@@ -19,13 +19,15 @@ class Module
end
methods.each do |method|
- if instance_methods.include?("#{method}_without_synchronization")
+ aliased_method, punctuation = method.to_s.sub(/([?!=])$/, ''), $1
+
+ if instance_methods.include?("#{aliased_method}_without_synchronization#{punctuation}")
raise ArgumentError, "#{method} is already synchronized. Double synchronization is not currently supported."
end
module_eval(<<-EOS, __FILE__, __LINE__)
- def #{method}_with_synchronization(*args, &block)
+ def #{aliased_method}_with_synchronization#{punctuation}(*args, &block)
#{with}.synchronize do
- #{method}_without_synchronization(*args,&block)
+ #{aliased_method}_without_synchronization#{punctuation}(*args,&block)
end
end
EOS
diff --git a/activesupport/test/core_ext/module/synchronization_test.rb b/activesupport/test/core_ext/module/synchronization_test.rb
index 78be6b725f..fe0f3b1a3b 100644
--- a/activesupport/test/core_ext/module/synchronization_test.rb
+++ b/activesupport/test/core_ext/module/synchronization_test.rb
@@ -54,4 +54,18 @@ class SynchronizationTest < Test::Unit::TestCase
@instance.to_s
assert_equal 2, dummy.sync_count
end
+
+ def test_can_synchronize_method_with_punctuation
+ @target.module_eval do
+ def dangerous?
+ @dangerous
+ end
+ def dangerous!
+ @dangerous = true
+ end
+ end
+ @target.synchronize :dangerous?, :dangerous!, :with => :mutex
+ @instance.dangerous!
+ assert @instance.dangerous?
+ end
end \ No newline at end of file