aboutsummaryrefslogtreecommitdiffstats
path: root/activesupport/lib/active_support/core_ext/module/introspection.rb
diff options
context:
space:
mode:
authorJeremy Kemper <jeremy@bitsweat.net>2008-07-09 19:43:38 -0700
committerJeremy Kemper <jeremy@bitsweat.net>2008-07-14 10:46:16 -0700
commit269c6c6bcfec342cf830e0b20c44bb2c888e8fdf (patch)
treee4ae29bf0d7a8c2bc9b9f2be7d4adb1bdd75f714 /activesupport/lib/active_support/core_ext/module/introspection.rb
parentae9356ae9eff4072efae7433204578c30c6ddbf7 (diff)
downloadrails-269c6c6bcfec342cf830e0b20c44bb2c888e8fdf.tar.gz
rails-269c6c6bcfec342cf830e0b20c44bb2c888e8fdf.tar.bz2
rails-269c6c6bcfec342cf830e0b20c44bb2c888e8fdf.zip
Cache Module#parent_name
Diffstat (limited to 'activesupport/lib/active_support/core_ext/module/introspection.rb')
-rw-r--r--activesupport/lib/active_support/core_ext/module/introspection.rb23
1 files changed, 17 insertions, 6 deletions
diff --git a/activesupport/lib/active_support/core_ext/module/introspection.rb b/activesupport/lib/active_support/core_ext/module/introspection.rb
index bb894ec080..45f3e4bf5c 100644
--- a/activesupport/lib/active_support/core_ext/module/introspection.rb
+++ b/activesupport/lib/active_support/core_ext/module/introspection.rb
@@ -1,4 +1,14 @@
class Module
+ # Returns the name of the module containing this one.
+ #
+ # p M::N.parent_name # => "M"
+ def parent_name
+ unless defined? @parent_name
+ @parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil
+ end
+ @parent_name
+ end
+
# Returns the module which contains this one according to its name.
#
# module M
@@ -16,8 +26,7 @@ class Module
# p Module.new.parent # => Object
#
def parent
- parent_name = name.split('::')[0..-2] * '::'
- parent_name.empty? ? Object : parent_name.constantize
+ parent_name ? parent_name.constantize : Object
end
# Returns all the parents of this module according to its name, ordered from
@@ -35,10 +44,12 @@ class Module
#
def parents
parents = []
- parts = name.split('::')[0..-2]
- until parts.empty?
- parents << (parts * '::').constantize
- parts.pop
+ if parent_name
+ parts = parent_name.split('::')
+ until parts.empty?
+ parents << (parts * '::').constantize
+ parts.pop
+ end
end
parents << Object unless parents.include? Object
parents