Various extensions for the Ruby core Module class.

Methods
Public Instance methods
alias_attribute(new_name, old_name)

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"
    # 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
alias_method_chain(target, feature) {|aliased_target, punctuation| ...}

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.

    # 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
local_constant_names()

Returns the names of the constants defined locally rather than the constants themselves. See local_constants.

    # 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
local_constants()

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.

    # 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
model_name()

Returns an ActiveSupport::ModelName object for module. It can be used to retrieve all kinds of naming-related information.

    # 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
parent()

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
    # File activesupport/lib/active_support/core_ext/module/introspection.rb, line 30
30:       def parent
31:         parent_name ? parent_name.constantize : Object
32:       end
parent_name()

Returns the name of the module containing this one.

  p M::N.parent_name # => "M"
    # 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
parents()

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]
    # 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