fleshing out the LWES::Event class
[lwes-ruby.git] / lib / lwes / event.rb
bloba717b5178f6c9a98272eea978b1d49508d145bb3
1 # this class is incomplete, but will eventually be subclassable
2 # like Struct in Ruby
3 class LWES::Event
4   SYM2ATTR = Hash.new { |h,k| h[k] = k.to_s.freeze } # :nodoc:
6   def self.subclass(name, type_db)
7     klass = Class.new(self)
8     klass.const_set :TYPE_DB, type_db
9     klass.const_set :NAME, name.to_s.dup.freeze
10     dump = type_db.to_hash
11     meta = dump[:MetaEventInfo] || []
12     methods = meta + dump[name.to_sym]
13     methods = methods.inject("") do |str, (k,_)|
14       str << "def #{k}; self[:#{k}]; end\n"
15       str << "def #{k}= val; self[:#{k}] = val; end\n"
16     end
17     klass.class_eval methods
18     klass
19   end
21   def inspect
22     klass = self.class
23     if LWES::Event == klass
24       "#<#{klass}:#{to_hash.inspect}>"
25     else
26       "#<#{klass}(event:#{klass.const_get(:NAME)}):#{to_hash.inspect}>"
27     end
28   end
30   def merge! src
31     src.to_hash.each do |k,v|
32       begin
33         self[k] = v
34       rescue ArgumentError
35         raise if k != :name
36       end
37     end
38     self
39   end
41   alias_method :initialize_copy, :merge!
43   def merge src
44     dup.merge! src
45   end
46 end