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