Class: Hashery::PropertyHash

Inherits:
CRUDHash show all
Defined in:
lib/hashery/property_hash.rb

Overview

A PropertyHash is the same as a regular Hash except it strictly limits the allowed keys.

There are two ways to use it.

1) As an object in itself.

h = PropertyHash.new(:a=>1, :b=>2)
h[:a]        #=> 1
h[:a] = 3
h[:a]        #=> 3

But if we try to set key that was not fixed, then we will get an error.

h[:x] = 5    #=> ArgumentError

2) As a superclass.

class MyPropertyHash < PropertyHash
  property :a, :default => 1
  property :b, :default => 2
end

h = MyPropertyHash.new
h[:a]        #=> 1
h[:a] = 3
h[:a]        #=> 3

Again, if we try to set key that was not fixed, then we will get an error.

h[:x] = 5    #=> ArgumentError

Constant Summary

Constant Summary

Constants inherited from CRUDHash

CRUDHash::NA

Class Method Summary (collapse)

Instance Method Summary (collapse)

Methods inherited from CRUDHash

#<<, [], #[], #[]=, auto, #cast, #cast_key, #default_proc, #delete, #each, #fetch, #key?, #key_proc, #key_proc=, #merge, #read, #replace, #retrieve, #to_hash, #update, #values_at

Methods inherited from Hash

create, #rekey, #rekey!, #retrieve, #to_hash, #to_stash

Constructor Details

- (PropertyHash) initialize(properties = {}, &default_proc)

Initialize new instance of PropertyHash.

properties - [Hash] Priming properties with default values, or

if it doesn't respond to #each_pair, a default object.

default_proc - [Proc] Procedure for default value of properties

for properties without specific defaults.


76
77
78
79
80
81
82
83
84
85
86
# File 'lib/hashery/property_hash.rb', line 76

def initialize(properties={}, &default_proc)
  if properties.respond_to?(:each_pair)
    super(&default_proc)
    fixed = self.class.properties.merge(properties)
    fixed.each_pair do |key, value|
      store!(key, value)
    end
  else
    super(*[properties].compact, &default_proc)
  end
end

Class Method Details

+ (Object) properties

Get a list of properties with default values.

Returns [Hash] of properties and their default values.



44
45
46
47
48
49
50
51
52
53
# File 'lib/hashery/property_hash.rb', line 44

def self.properties
  @properties ||= (
    parent = ancestors[1]
    if parent.respond_to?(:properties)
      parent.properties
    else
      {}
    end
  )
end

+ (Object) property(key, opts = {})

Define a property.

key - Name of property. opts - Property options.

:default - Default value of property.

Returns default value.



64
65
66
# File 'lib/hashery/property_hash.rb', line 64

def self.property(key, opts={})
  properties[key] = opts[:default]
end

Instance Method Details

- (Object) assert_key!(key) (private)

Asserta that a key is a defined property.

Raises ArgumentError if key is not a property.



153
154
155
156
157
# File 'lib/hashery/property_hash.rb', line 153

def assert_key!(key)
  unless key?(key)
    raise ArgumentError, "property is not defined -- #{key.inspect}"
  end
end

- (Object) property(key, opts = {})

Create a new property, on-the-fly.

key - Name of property. opts - Property options.

:default - Default value of property.

Returns default value.



101
102
103
104
105
106
107
# File 'lib/hashery/property_hash.rb', line 101

def property(key, opts={})
  if opts[:default]
    store!(key, opts[:default])
  else
    store!(key, retrieve(key))
  end
end

- (Object) store(key, value)

Store key value pair, ensuring the key is a valid property first.

key - The `Object` to act as indexing key. value - The `Object` to associate with key.

Raises ArgumentError if key is not a valid property.

Returns value.



119
120
121
122
# File 'lib/hashery/property_hash.rb', line 119

def store(key, value)
  assert_key!(key)
  super(key, value)
end

- (Object) store! (private)

Alias original #store method and make private.



89
# File 'lib/hashery/property_hash.rb', line 89

alias :store! :store