update gemspec
[lwes-ruby.git] / lib / lwes / event.rb
blob5a99296608c160c9c746b0cc47400b5570853b72
1 # Used for mapping LWES events in in an ESF file to a Ruby object.
2 # LWES::Event-derived classes are more memory efficient if your event
3 # definitions have many unused fields.
5 # LWES::TypeDB.create_classes! with +:sparse+ set to +true+ will create
6 # classes subclassed from LWES::Event instead of LWES::Struct.
8 # For users unable to use LWES::Listener, LWES::Event.parse may also be
9 # used with UDPSocket (distributed with Ruby) to parse events:
11 #   receiver = UDPSocket.new
12 #   receiver.bind(nil, port)
13 #   buffer, addr = receiver.recvfrom(65536)
14 #   event = LWES::Event.parse(buffer)
16 class LWES::Event
17   SYM2ATTR = Hash.new { |h,k| h[k] = k.to_s.freeze } # :nodoc:
19   # used to cache classes for LWES::Event.parse
20   CLASSES = {} # :nodoc:
21   extend LWES::ClassMaker
23   # There is no need to call this method directly.  use
24   # LWES::TypeDB.create_classes! with the +:sparse+ flag set to +true+.
25   #
26   # This takes the same options as LWES::Struct.new.
27   def self.subclass(options, &block)
28     db = type_db(options)
29     dump = db.to_hash
30     klass, name, event_def = class_for(options, dump)
31     tmp = Class.new(self)
32     set_constants(tmp, db, klass, name, options)
33     tmp.class_eval(&block) if block_given?
35     meta = dump[:MetaEventInfo] || []
36     methods = meta + event_def
37     methods = methods.inject("") do |str, (k,_)|
38       str << "def #{k}; self[:#{k}]; end\n"
39       str << "def #{k}= val; self[:#{k}] = val; end\n"
40     end
41     methods << "def initialize(src = nil); merge!(DEFAULTS); super; end\n"
42     tmp.class_eval methods
43     CLASSES[name] = tmp
44   end
46   # returns a human-readable representation of the event
47   def inspect
48     klass = self.class
49     if LWES::Event == klass
50       "#<#{klass}:#{to_hash.inspect}>"
51     else
52       "#<#{klass}(event:#{klass.const_get(:NAME)}):#{to_hash.inspect}>"
53     end
54   end
56   # overwrites the values of the existing event with those given in +src+
57   def merge! src
58     src.to_hash.each { |k,v| self[k] = v }
59     self
60   end
62   alias_method :initialize_copy, :merge!
64   # duplicates the given event and overwrites the copy with values given
65   # in +src+
66   def merge src
67     dup.merge! src
68   end
70 private
72   # Initializes a new LWES::Event.  If +src+ is given, it must be an
73   # LWES::Event or hash which the new event takes initial values from
74   def initialize(src = nil)
75     src and merge! src
76   end
77 end