mash.rb

Path: lib/mash.rb
Last Update: Mon Dec 05 15:56:24 +0000 2011

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.

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">

[Validate]