module BinData::BitField

def define_methods(bit_class, nbits, endian, signed)

def define_methods(bit_class, nbits, endian, signed)
  bit_class.module_eval <<-END
    #{create_params_code(nbits)}
    def assign(val)
      #{create_nbits_code(nbits)}
      #{create_clamp_code(nbits, signed)}
      super(val)
    end
    def do_write(io)
      #{create_nbits_code(nbits)}
      val = _value
      #{create_int2uint_code(nbits, signed)}
      io.writebits(val, #{nbits}, :#{endian})
    end
    def do_num_bytes
      #{create_nbits_code(nbits)}
      #{create_do_num_bytes_code(nbits)}
    end
    def bit_aligned?
      true
    end
    #---------------
    private
    def read_and_return_value(io)
      #{create_nbits_code(nbits)}
      val = io.readbits(#{nbits}, :#{endian})
      #{create_uint2int_code(nbits, signed)}
      val
    end
    def sensible_default
      0
    end
  END
end