diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2004-12-29 21:03:21 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2004-12-29 21:03:21 +0000 |
commit | bd323b3c99437cf1a50d7b4c23a64f296859c56a (patch) | |
tree | 943347b52f12f8df492c0864e7ba61318e459f63 /activesupport/lib/class_inheritable_attributes.rb | |
parent | 1b0da48fe98abc67b56bc76f2af59a90198b21cc (diff) | |
download | rails-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.rb | 41 |
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 |