lib/mida/vocabulary.rb in mida-0.2.0 vs lib/mida/vocabulary.rb in mida-0.3.0

- old
+ new

@@ -1,26 +1,80 @@ +require 'set' module Mida - # Module to register the Vocabularies with - module Vocabulary + # Class used to describe a vocabulary + # + # To specify a vocabulary use the following methods: + # +itemtype+, +has_one+, +has_many+ + class Vocabulary + class << self + # Return the properties specification + attr_reader :properties + + # Return the registered vocabularies + attr_reader :vocabularies + end + + @vocabularies = Set.new + @properties = {} + # Register a vocabulary that can be used when parsing, # later vocabularies are given precedence over earlier ones def self.register(vocabulary) - (@vocabularies ||= []) << vocabulary + @vocabularies << vocabulary end + # Un-register a vocabulary + def self.unregister(vocabulary) + @vocabularies.delete(vocabulary) + end + # Find the last vocabulary registered that matches the itemtype def self.find(itemtype) @vocabularies.reverse_each do |vocabulary| if ((itemtype || "") =~ vocabulary.itemtype) then return vocabulary end end nil end - # Return the registered vocabularies - def self.vocabularies - @vocabularies + def self.inherited(subclass) + register(subclass) end + + # Sets the regular expression to match against the +itemtype+ + # or returns the current regular expression + def self.itemtype(regexp_arg=nil) + if regexp_arg + @itemtype = regexp_arg + else + @itemtype + end + end + + + # Defines the properties as only containing one value + # If want to say any property name, then use +:any+ as a name + # Within a block you can use the methods of the class +PropertyDesc+ + def self.has_one(*property_names, &block) + has(:one, *property_names, &block) + end + + # Defines the properties as containing many values + # If want to say any property name, then use +:any+ as a name + # Within a block you can use the methods of the class +PropertyDesc+ + def self.has_many(*property_names, &block) + has(:many, *property_names, &block) + end + + def self.has(num, *property_names, &block) + @properties ||= {} + property_names.each_with_object(@properties) do |name, properties| + property_desc = PropertyDesc.new(num, &block) + properties[name] = property_desc.to_h + end + end + + private_class_method :has end end