aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/class_inheritable_attributes.rb
diff options
context:
space:
mode:
authorDavid Heinemeier Hansson <david@loudthinking.com>2004-12-29 21:03:21 +0000
committerDavid Heinemeier Hansson <david@loudthinking.com>2004-12-29 21:03:21 +0000
commitbd323b3c99437cf1a50d7b4c23a64f296859c56a (patch)
tree943347b52f12f8df492c0864e7ba61318e459f63 /activesupport/lib/class_inheritable_attributes.rb
parent1b0da48fe98abc67b56bc76f2af59a90198b21cc (diff)
downloadrails-bd323b3c99437cf1a50d7b4c23a64f296859c56a.tar.gz
rails-bd323b3c99437cf1a50d7b4c23a64f296859c56a.tar.bz2
rails-bd323b3c99437cf1a50d7b4c23a64f296859c56a.zip
Moved support from both Action Pack and Active Record into a separate module called Active Support that can be included using svn:externals in both
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@273 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'activesupport/lib/class_inheritable_attributes.rb')
-rw-r--r--activesupport/lib/class_inheritable_attributes.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/activesupport/lib/class_inheritable_attributes.rb b/activesupport/lib/class_inheritable_attributes.rb
new file mode 100644
index 0000000000..39312e8d5b
--- /dev/null
+++ b/activesupport/lib/class_inheritable_attributes.rb
@@ -0,0 +1,41 @@
+# Allows attributes to be shared within an inheritance hierarchy, but where each descendant gets a copy of
+# their parents' attributes, instead of just a pointer to the same. This means that the child can add elements
+# to, for example, an array without those additions being shared with either their parent, siblings, or
+# children, which is unlike the regular class-level attributes that are shared across the entire hierarchy.
+module ClassInheritableAttributes # :nodoc:
+ def self.append_features(base)
+ super
+ base.extend(ClassMethods)
+ end
+
+ module ClassMethods # :nodoc:
+ @@classes ||= {}
+
+ def inheritable_attributes
+ @@classes[self] ||= {}
+ end
+
+ def write_inheritable_attribute(key, value)
+ inheritable_attributes[key] = value
+ end
+
+ def write_inheritable_array(key, elements)
+ write_inheritable_attribute(key, []) if read_inheritable_attribute(key).nil?
+ write_inheritable_attribute(key, read_inheritable_attribute(key) + elements)
+ end
+
+ def read_inheritable_attribute(key)
+ inheritable_attributes[key]
+ end
+
+ def reset_inheritable_attributes
+ inheritable_attributes.clear
+ end
+
+ private
+ def inherited(child)
+ @@classes[child] = inheritable_attributes.dup
+ end
+
+ end
+end