class Property
Constants
- GOOD_KEY_RGX
Public Class Methods
bad_key?(idx)
click to toggle source
# File lib/primitive_wrapper.rb, line 552 def self.bad_key?(idx) @badkeys ||= {} true==@badkeys[idx] end
good_candidate_name?(name)
click to toggle source
# File lib/primitive_wrapper.rb, line 557 def self.good_candidate_name? name name = name.prim_value return false unless name.kind_of? Symbol tst = GOOD_KEY_RGX.match name return false if tst.nil? true end
good_key?(idx)
click to toggle source
# File lib/primitive_wrapper.rb, line 565 def self.good_key?(idx) # syntax and not bad ... does not check to see if taken as only instansts can do that idx = idx.prim_value return false unless good_candidate_name? idx return false if bad_key?(idx) true end
new(hash={})
click to toggle source
# File lib/primitive_wrapper.rb, line 548 def initialize(hash={}) self.val=(hash) end
reserve_property_names!(*names)
click to toggle source
# File lib/primitive_wrapper.rb, line 572 def self.reserve_property_names!(*names) @badkeys ||= {} names = names.first if names.first.kind_of? Array names.each do |key| next if key[-1]=='!' next if key[-1]=='?' kw = key[-1]=='=' ? key[0..-2] : key[0..-1] md = GOOD_KEY_RGX.match kw next if md.nil? # bad key @badkeys[key]=true end end
Public Instance Methods
[](idx)
click to toggle source
# File lib/primitive_wrapper.rb, line 657 def [](idx) @value[idx] end
[]=(idx,val)
click to toggle source
# File lib/primitive_wrapper.rb, line 661 def []=(idx,val) idx = idx.prim_value # in case it is wrapped rtn = @value[idx] = val # now put key in one of two bins if self.class.good_key? idx @good_keys[idx]=true else @hold_keys[idx]=true end return rtn end
deferred?(tst)
click to toggle source
# File lib/primitive_wrapper.rb, line 701 def deferred?(tst) rekey! tst = tst.prim_value return true if @hold_keys.include? tst false end
deferred_properties!()
click to toggle source
# File lib/primitive_wrapper.rb, line 689 def deferred_properties! rekey! @hold_keys.keys # can't sort bad keys without a ton of work end
define_properties!(ary, dflt="")
click to toggle source
# File lib/primitive_wrapper.rb, line 708 def define_properties!(ary, dflt="") ary.each do |item| key = item.prim_value raise "*** Property Error: must use Symbol type to define properties" unless key.kind_of? Symbol raise "*** Property Error: property #{key.inspect} already defined" if @good_keys.include? key raise "*** Property Error: property #{key.inspect} violates naming convention" unless self.class.good_candidate_name? key raise "*** Property Error: property #{key.inspect} is reserved" if self.class.bad_key? key @good_keys[key]=true @value[key]=dflt end end
defined_properties!()
click to toggle source
# File lib/primitive_wrapper.rb, line 685 def defined_properties! rekey! @good_keys.keys.sort end
import_hash!(hash)
click to toggle source
# File lib/primitive_wrapper.rb, line 673 def import_hash!(hash) hash.each_pair do |key,val| self[key]=val end end
method_missing(method, *args, &block)
click to toggle source
Calls superclass method
# File lib/primitive_wrapper.rb, line 608 def method_missing(method, *args, &block) flag_good = @good_keys.include? method unless flag_good unless method[-1]=='=' if @value.include? method rekey! flag_good = @good_keys.include? method end end end raise "Illegal Block attachment" unless block.nil? if flag_good raise "*** ArgumentError Exception: wrong number of arguments (given #{args.count}, expected 0)" unless args.empty? return @value[method] end if method[-1]=='=' # assignment key = method[0..-2].to_sym if args.count==1 if @good_keys.include? key @value[key] = args[0] return true end # creating a new key here ... good or bad? if self.class.good_key? key @good_keys[key]=true else @hold_keys[key]=true end return @value[key] = args[0] end raise "*** ArgumentError Exception: wrong number of arguments (given #{args.count}, expected 1)" else # lookup failed ... punt super end end
property?(tst)
click to toggle source
# File lib/primitive_wrapper.rb, line 694 def property?(tst) rekey! tst = tst.prim_value return true if @good_keys.include? tst false end
rekey!()
click to toggle source
# File lib/primitive_wrapper.rb, line 595 def rekey! @good_keys = {} # these keys can be properties @hold_keys = {} # these keys can't @value.each_pair do |pkey,val| key = pkey.prim_value if self.class.good_key? key @good_keys[key.prim_value]=true else @hold_keys[key.prim_value]=true end end end
split!()
click to toggle source
# File lib/primitive_wrapper.rb, line 645 def split! good = {} bad = {} @good_keys.each_pair do |key,val| good[key] = @value[key] end @hold_keys.each_pair do |key,val| bad[key] = @value[key] end return [good, bad] end
val=(hash)
click to toggle source
assign replacement hash
# File lib/primitive_wrapper.rb, line 588 def val=(hash) ensure_valid(hash) hash = hash.prim_value @value = hash # keep this as prime as possible rekey! end
valid_type(prm)
click to toggle source
# File lib/primitive_wrapper.rb, line 679 def valid_type(prm) return true if prm.kind_of? Hash return true if prm.kind_of? Property false end