Module: PassiveSupport::CoreExtensions::Module
- Included in:
- Module
- Defined in:
- lib/passive_support/core_ext/module.rb,
lib/passive_support/core_ext/module/aliasing.rb,
lib/passive_support/core_ext/module/model_naming.rb,
lib/passive_support/core_ext/module/introspection.rb
Overview
Various extensions for the Ruby core Module class.
Instance Method Summary collapse
-
#alias_attribute(new_name, old_name) ⇒ Object
Allows you to make aliases for attributes, which includes getter, setter, and query methods.
-
#alias_method_chain(target, feature) {|aliased_target, punctuation| ... } ⇒ Object
Encapsulates the common pattern of:.
-
#local_constant_names ⇒ Object
Returns the names of the constants defined locally rather than the constants themselves.
-
#local_constants ⇒ Object
:nodoc:.
-
#model_name ⇒ Object
Returns an PassiveSupport::ModelName object for module.
-
#parent ⇒ Object
Returns the module which contains this one according to its name.
-
#parent_name ⇒ Object
Returns the name of the module containing this one.
-
#parents ⇒ Object
Returns all the parents of this module according to its name, ordered from nested outwards.
Instance Method Details
#alias_attribute(new_name, old_name) ⇒ Object
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"
65 66 67 68 69 70 71 |
# File 'lib/passive_support/core_ext/module/aliasing.rb', line 65 def alias_attribute(new_name, old_name) module_eval <<-STR, __FILE__, __LINE__ + 1 def #{new_name}; self.#{old_name}; end # def subject; self.title; end def #{new_name}?; self.#{old_name}?; end # def subject?; self.title?; end def #{new_name}=(v); self.#{old_name} = v; end # def subject=(v); self.title = v; end STR end |
#alias_method_chain(target, feature) {|aliased_target, punctuation| ... } ⇒ Object
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.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/passive_support/core_ext/module/aliasing.rb', line 25 def alias_method_chain(target, feature) # Strip out punctuation on predicates or bang methods since # e.g. target?_without_feature is not a valid method name. aliased_target, punctuation = target.to_s.sub(/([?!=])$/, ''), $1 yield(aliased_target, punctuation) if block_given? with_method, without_method = "#{aliased_target}_with_#{feature}#{punctuation}", "#{aliased_target}_without_#{feature}#{punctuation}" alias_method without_method, target alias_method target, with_method case when public_method_defined?(without_method) public target when protected_method_defined?(without_method) protected target when private_method_defined?(without_method) private target end end |
#local_constant_names ⇒ Object
Returns the names of the constants defined locally rather than the constants themselves. See local_constants
.
85 86 87 |
# File 'lib/passive_support/core_ext/module/introspection.rb', line 85 def local_constant_names local_constants.map { |c| c.to_s } end |
#local_constants ⇒ Object
:nodoc:
65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/passive_support/core_ext/module/introspection.rb', line 65 def local_constants inherited = {} ancestors.each do |anc| next if anc == self anc.constants.each { |const| inherited[const] = anc.const_get(const) } end constants.select do |const| !inherited.key?(const) || inherited[const].object_id != const_get(const).object_id end end |
#model_name ⇒ Object
Returns an PassiveSupport::ModelName object for module. It can be used to retrieve all kinds of naming-related information.
20 21 22 |
# File 'lib/passive_support/core_ext/module/model_naming.rb', line 20 def model_name @model_name ||= ::PassiveSupport::ModelName.new(name) end |
#parent ⇒ Object
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
30 31 32 |
# File 'lib/passive_support/core_ext/module/introspection.rb', line 30 def parent parent_name ? parent_name.constantize : Object end |
#parent_name ⇒ Object
Returns the name of the module containing this one.
p M::N.parent_name # => "M"
7 8 9 10 11 12 |
# File 'lib/passive_support/core_ext/module/introspection.rb', line 7 def parent_name unless defined? @parent_name @parent_name = name =~ /::[^:]+\Z/ ? $`.freeze : nil end @parent_name end |
#parents ⇒ Object
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]
47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/passive_support/core_ext/module/introspection.rb', line 47 def parents parents = [] if parent_name parts = parent_name.split('::') until parts.empty? parents << (parts * '::').constantize parts.pop end end parents << Object unless parents.include? Object parents end |