Various extensions for the Ruby core Module class.
- alias_attribute
- alias_method_chain
- local_constant_names
- local_constants
- model_name
- parent
- parent_name
- parents
Allows you to make aliases for attributes, which includes getter, setter, and query methods.
Example:
class Content < ActiveRecord::Base # has a title attribute end class Email < Content alias_attribute :subject, :title end e = Email.find(1) e.title # => "Superstars" e.subject # => "Superstars" e.subject? # => true e.subject = "Megastars" e.title # => "Megastars"
[ show source ]
# File activesupport/lib/active_support/core_ext/module/aliasing.rb, line 65 65: def alias_attribute(new_name, old_name) 66: module_eval "def \#{new_name}; self.\#{old_name}; end # def subject; self.title; end\ndef \#{new_name}?; self.\#{old_name}?; end # def subject?; self.title?; end\ndef \#{new_name}=(v); self.\#{old_name} = v; end # def subject=(v); self.title = v; end\n", __FILE__, __LINE__ + 1 67: end
Encapsulates the common pattern of:
alias_method :foo_without_feature, :foo alias_method :foo, :foo_with_feature
With this, you simply do:
alias_method_chain :foo, :feature
And both aliases are set up for you.
Query and bang methods (foo?, foo!) keep the same punctuation:
alias_method_chain :foo?, :feature
is equivalent to
alias_method :foo_without_feature?, :foo? alias_method :foo?, :foo_with_feature?
so you can safely chain foo, foo?, and foo! with the same feature.
[ show source ]
# File activesupport/lib/active_support/core_ext/module/aliasing.rb, line 25 25: def alias_method_chain(target, feature) 26: # Strip out punctuation on predicates or bang methods since 27: # e.g. target?_without_feature is not a valid method name. 28: aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1 29: yield(aliased_target, punctuation) if block_given? 30: 31: with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}" 32: 33: alias_method without_method, target 34: alias_method target, with_method 35: 36: case 37: when public_method_defined?(without_method) 38: public target 39: when protected_method_defined?(without_method) 40: protected target 41: when private_method_defined?(without_method) 42: private target 43: end 44: end
Returns the names of the constants defined locally rather than the constants themselves. See local_constants.
[ show source ]
# File activesupport/lib/active_support/core_ext/module/introspection.rb, line 85 85: def local_constant_names 86: local_constants.map { |c| c.to_s } 87: end
Returns the constants that have been defined locally by this object and not in an ancestor. This method is exact if running under Ruby 1.9. In previous versions it may miss some constants if their definition in some ancestor is identical to their definition in the receiver.
[ show source ]
# File activesupport/lib/active_support/core_ext/module/introspection.rb, line 65 65: def local_constants 66: inherited = {} 67: 68: ancestors.each do |anc| 69: next if anc == self 70: anc.constants.each { |const| inherited[const] = anc.const_get(const) } 71: end 72: 73: constants.select do |const| 74: !inherited.key?(const) || inherited[const].object_id != const_get(const).object_id 75: end 76: end
Returns an ActiveSupport::ModelName object for module. It can be used to retrieve all kinds of naming-related information.
[ show source ]
# File activesupport/lib/active_support/core_ext/module/model_naming.rb, line 20 20: def model_name 21: @model_name ||= ::ActiveSupport::ModelName.new(name) 22: end
Returns the module which contains this one according to its name.
module M module N end end X = M::N p M::N.parent # => M p X.parent # => M
The parent of top-level and anonymous modules is Object.
p M.parent # => Object p Module.new.parent # => Object
[ show source ]
# File activesupport/lib/active_support/core_ext/module/introspection.rb, line 30 30: def parent 31: parent_name ? parent_name.constantize : Object 32: end
Returns the name of the module containing this one.
p M::N.parent_name # => "M"
[ show source ]
# File activesupport/lib/active_support/core_ext/module/introspection.rb, line 7 7: def parent_name 8: unless defined? @parent_name 9: @parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil 10: end 11: @parent_name 12: end
Returns all the parents of this module according to its name, ordered from nested outwards. The receiver is not contained within the result.
module M module N end end X = M::N p M.parents # => [Object] p M::N.parents # => [M, Object] p X.parents # => [M, Object]
[ show source ]
# File activesupport/lib/active_support/core_ext/module/introspection.rb, line 47 47: def parents 48: parents = [] 49: if parent_name 50: parts = parent_name.split('::') 51: until parts.empty? 52: parents << (parts * '::').constantize 53: parts.pop 54: end 55: end 56: parents << Object unless parents.include? Object 57: parents 58: end