Class: Hashie::Mash

### Home Classes Methods

### In Files

- lib/hashie/mash.rb

### Parent

Hashie::Hash

### Methods

- ::[]
- ::new
- #[]
- #custom_reader
- #deep_merge
- #deep_merge!
- #deep_update
- #delete
- #dup
- #fetch
- #has_key?
- #include?
- #initializing_reader
- #key?
- #member?
- #merge
- #merge!
- #method_missing
- #prefix_method?
- #regular_dup
- #regular_reader
- #replace
- #respond_to?
- #shallow_merge
- #shallow_update
- #underbang_reader
- #update

### Included Modules

- Hashie::PrettyInspect

### Class/Module Index

Quicksearch

- Hashie
- Hashie::Clash
- Hashie::Clash::ChainError
- Hashie::Dash
- Hashie::Extensions
- Hashie::Extensions::Coercion
- Hashie::Extensions::Coercion::ClassMethods
- Hashie::Extensions::Coercion::InstanceMethods
- Hashie::Extensions::DeepFetch
- Hashie::Extensions::DeepFetch::UndefinedPathError
- Hashie::Extensions::DeepMerge
- Hashie::Extensions::IgnoreUndeclared
- Hashie::Extensions::IndifferentAccess
- Hashie::Extensions::KeyConversion
- Hashie::Extensions::MergeInitializer
- Hashie::Extensions::MethodAccess
- Hashie::Extensions::MethodQuery
- Hashie::Extensions::MethodReader
- Hashie::Extensions::MethodWriter
- Hashie::Extensions::StringifyKeys
- Hashie::Extensions::SymbolizeKeys
- Hashie::Hash
- Hashie::HashExtensions
- Hashie::Mash
- Hashie::PrettyInspect
- Hashie::Rash
- Hashie::Trash

No matching classes.

# Hashie::Mash

Mash allows you to create pseudo-objects that have method-like accessors for hash keys. This is useful for such implementations as an API-accessing library that wants to fake robust objects without the overhead of actually doing so. Think of it as OpenStruct with some additional goodies.

A Mash will look at the methods you pass it and perform operations based on the following rules:

- No punctuation: Returns the value of the hash for that key, or nil if none exists.

- Assignment (`=`): Sets the attribute of the given method name.

- Existence (`?`): Returns true or false depending on whether that key has been set.

- Bang (`!`): Forces the existence of this key, used for deep Mashes. Think of it as "touch" for mashes.

- Under Bang (`_`): Like Bang, but returns a new Mash rather than creating a key. Used to test existance in deep Mashes.

## Basic Example

    mash = Mash.new
    mash.name? # => false
    mash.name = "Bob"
    mash.name # => "Bob"
    mash.name? # => true

## Hash Conversion Example

    hash = {:a => {:b => 23, :d => {:e => "abc"}}, :f => [{:g => 44, :h => 29}, 12]}
    mash = Mash.new(hash)
    mash.a.b # => 23
    mash.a.d.e # => "abc"
    mash.f.first.g # => 44
    mash.f.last # => 12

## Bang Example

    mash = Mash.new
    mash.author # => nil
    mash.author! # => <Mash>

    mash = Mash.new
    mash.author!.name = "Michael Bleigh"
    mash.author # => <Mash name="Michael Bleigh">

## Under Bang Example

    mash = Mash.new
    mash.author # => nil
    mash.author_ # => <Mash>
    mash.author_.name # => nil

    mash = Mash.new
    mash.author_.name = "Michael Bleigh"  (assigned to temp object)
    mash.author # => <Mash>

### Constants

ALLOWED_SUFFIXES

### Public Class Methods

[](source_hash = nil, default = nil, &blk) click to toggle source
Alias for: new
new(source_hash = nil, default = nil, &blk) click to toggle source

If you pass in an existing hash, it will convert it to a Mash including recursively descending into arrays and hashes, converting them as well.

    # File lib/hashie/mash.rb, line 66
    def initialize(source_hash = nil, default = nil, &blk)
      deep_update(source_hash) if source_hash
      default ? super(default) : super(&blk)
    end

Also aliased as: []

### Public Instance Methods

[](key) click to toggle source
Also aliased as: regular_reader
Alias for: custom_reader
custom_reader(key) click to toggle source

Retrieves an attribute set in the Mash. Will convert any key passed in to a string before retrieving.

    # File lib/hashie/mash.rb, line 86
    def custom_reader(key)
      value = regular_reader(convert_key(key))
      yield value if block_given?
      value
    end

Also aliased as: []
deep_merge(other_hash, &blk) click to toggle source

Performs a deep_update on a duplicate of the current mash.

    # File lib/hashie/mash.rb, line 144
    def deep_merge(other_hash, &blk)
      dup.deep_update(other_hash, &blk)
    end

Also aliased as: merge
deep_merge!(other_hash, &blk) click to toggle source
Alias for: deep_update
deep_update(other_hash, &blk) click to toggle source

Recursively merges this mash with the passed in hash, merging each hash in the hierarchy.

    # File lib/hashie/mash.rb, line 151
    def deep_update(other_hash, &blk)
      other_hash.each_pair do |k, v|
        key = convert_key(k)
        if regular_reader(key).is_a?(Mash) && v.is_a?(::Hash)
          custom_reader(key).deep_update(v, &blk)
        else
          value = convert_value(v, true)
          value = convert_value(blk.call(key, self[k], value), true) if blk
          custom_writer(key, value, false)
        end
      end
      self
    end

Also aliased as: deep_merge!, update
delete(key) click to toggle source

    # File lib/hashie/mash.rb, line 125
    def delete(key)
      super(convert_key(key))
    end

dup() click to toggle source

Duplicates the current mash as a new mash.

    # File lib/hashie/mash.rb, line 131
    def dup
      self.class.new(self, default)
    end

Also aliased as: regular_dup
fetch(key, *args) click to toggle source

    # File lib/hashie/mash.rb, line 121
    def fetch(key, *args)
      super(convert_key(key), *args)
    end

has_key?(key) click to toggle source
Alias for: key?
include?(key) click to toggle source
Alias for: key?
initializing_reader(key) click to toggle source

This is the bang method reader, it will return a new Mash if there isn't a value already assigned to the key requested.

    # File lib/hashie/mash.rb, line 104
    def initializing_reader(key)
      ck = convert_key(key)
      regular_writer(ck, self.class.new) unless key?(ck)
      regular_reader(ck)
    end

key?(key) click to toggle source

    # File lib/hashie/mash.rb, line 135
    def key?(key)
      super(convert_key(key))
    end

Also aliased as: has_key?, include?, member?
member?(key) click to toggle source
Alias for: key?
merge(other_hash, &blk) click to toggle source
Alias for: deep_merge
merge!(other_hash, &blk) click to toggle source
Alias for: update
method_missing(method_name, *args, &blk) click to toggle source

    # File lib/hashie/mash.rb, line 200
    def method_missing(method_name, *args, &blk)
      return self.[](method_name, &blk) if key?(method_name)
      suffixes_regex = ALLOWED_SUFFIXES.join
      match = method_name.to_s.match(/(.*?)([#{suffixes_regex}]?)$/)
      case match[2]
      when '='
        self[match[1]] = args.first
      when '?'
        !!self[match[1]]
      when '!'
        initializing_reader(match[1])
      when '_'
        underbang_reader(match[1])
      else
        default(method_name)
      end
    end

prefix_method?(method_name) click to toggle source

    # File lib/hashie/mash.rb, line 195
    def prefix_method?(method_name)
      method_name = method_name.to_s
      method_name.end_with?(*ALLOWED_SUFFIXES) && key?(method_name.chop)
    end

regular_dup() click to toggle source
Alias for: dup
regular_reader(key) click to toggle source
Alias for: []
replace(other_hash) click to toggle source

    # File lib/hashie/mash.rb, line 182
    def replace(other_hash)
      (keys - other_hash.keys).each { |key| delete(key) }
      other_hash.each { |key, value| self[key] = value }
      self
    end

respond_to?(method_name, include_private = false) click to toggle source

Will return true if the Mash has had a key set in addition to normal respond_to? functionality.

    # File lib/hashie/mash.rb, line 190
    def respond_to?(method_name, include_private = false)
      return true if key?(method_name) || prefix_method?(method_name)
      super
    end

shallow_merge(other_hash) click to toggle source

Performs a shallow_update on a duplicate of the current mash

    # File lib/hashie/mash.rb, line 169
    def shallow_merge(other_hash)
      dup.shallow_update(other_hash)
    end

shallow_update(other_hash) click to toggle source

Merges (non-recursively) the hash from the argument, changing the receiving hash

    # File lib/hashie/mash.rb, line 175
    def shallow_update(other_hash)
      other_hash.each_pair do |k, v|
        regular_writer(convert_key(k), convert_value(v, true))
      end
      self
    end

underbang_reader(key) click to toggle source

This is the under bang method reader, it will return a temporary new Mash if there isn't a value already assigned to the key requested.

    # File lib/hashie/mash.rb, line 112
    def underbang_reader(key)
      ck = convert_key(key)
      if key?(ck)
        regular_reader(ck)
      else
        self.class.new
      end
    end

update(other_hash, &blk) click to toggle source
Also aliased as: merge!
Alias for: deep_update

[Validate]

Generated with the Darkfish Rdoc Generator 2.