lib/blobject.rb in blobject-0.4.1 vs lib/blobject.rb in blobject-0.5.0
- old
+ new
@@ -9,12 +9,11 @@
# blobject which is not cool, especially if you are puts.
ProhibitedNames = [:to_ary]
# pass an optional hash of values to preload
# you can also pass a block, the new Blobject will be yield
- def initialize hash = {}
-
+ def initialize hash={}
@hash = Hash.new
hash.each do |key, value|
key = key.to_sym unless key.is_a? Symbol
@hash[key] = value
@@ -32,33 +31,30 @@
@hash.empty?
end
# delegates to the internal Hash
def inspect
-
@hash.inspect
end
# access the internal hash. be careful, this is _not_ a copy
def hash
@hash
end
# creates a recursive copy of the internal hash
def to_hash
-
h = hash.dup
@hash.each do |name, node|
h[name] = node.to_hash if node.respond_to? :to_hash
end
h
end
# method_missing is only called the first time an attribute is used. successive calls use
# memoized getters, setters and checkers
def method_missing method, *params, &block
-
__tag_and_raise__ NoMethodError.new(method) if ProhibitedNames.include?(method)
case
# assignment in conditionals is usually a bad smell, here it helps minimize regex matching
when (name = method[/^\w+$/, 0]) && params.length == 0
@@ -113,26 +109,18 @@
super
end
# hash-like access to the Blobject's attributes
def [] name
-
send name
end
# hash-like attribute setter
def []= name, value
-
send "#{name.to_s}=", value
end
- # freeze a Blobject to prevent it being modified
- def freeze
- self.class.send(:__freeze_r__, @hash) unless frozen?
- super
- end
-
# for rails: `render json: blobject`
def as_json *args
return hash.as_json(*args) if hash.respond_to? :as_json
to_hash
end
@@ -142,23 +130,20 @@
as_json.to_json *args
end
# serialize the Blobject as a yaml string
def to_yaml
-
as_yaml.to_yaml
end
# get a Blobject from a json string, if the yaml string describes an array, an array will be returned
def self.from_json json
-
__blobjectify__(JSON.parse(json))
end
# get a Blobject from a yaml string, if the yaml string describes an array, an array will be returned
def self.from_yaml yaml
-
__blobjectify__(YAML.load(yaml))
end
protected
# to avoid naming collisions private method names are prefixed and suffix with double unerscores (__)
@@ -187,34 +172,19 @@
class << self
protected
- def __freeze_r__ object
-
- if object.respond_to?(:each) && object.each.is_a?(Enumerator)
- values = object.is_a?(Hash) ? object.values : object
- values.each do |v|
- v.freeze
- __freeze_r__(v)
- end
- end
-
- object.freeze
- end
-
def __blobjectify__ object
-
array = object if object.is_a? Array
hash = object if object.is_a? Hash
return array.map{|a| __blobjectify__(a)} if array
return Blobject.new(hash) if hash
return object
end
def __define_attribute__ name
-
__tag_and_raise__ NameError.new("invalid attribute name #{name}") unless name =~ /^\w+$/
name = name.to_sym
methods = self.instance_methods