/*
 * Ruby Treasures 0.2
 * Copyright (C) 2002 Paul Brannan <paul@atdesk.com>
 * 
 * You may distribute this software under the same terms as Ruby (see the file
 * COPYING that was distributed with this library).
 * 
 */
#include <ruby.h>
#ifdef RUBY_TREASURES
#include "hacks_helper.h"
#endif

#define OBJ_UNFREEZE(x) FL_UNSET((x), FL_FREEZE)

static VALUE freeze_and_send(VALUE args) {
  if(RARRAY(args)->len < 1) {
    rb_raise(rb_eArgError, "not enough arguments");
  }

  OBJ_FREEZE(RARRAY(args)->ptr[0]);
  return ruby_safe_send(RARRAY(args)->len, RARRAY(args)->ptr, rb_mKernel);
}

static VALUE do_unfreeze(VALUE args) {
  OBJ_UNFREEZE(RARRAY(args)->ptr[0]);
  return Qnil;
}

static VALUE ruby_const_send(VALUE self, VALUE args) {
  if(OBJ_FROZEN(RARRAY(args)->ptr[0])) {
    freeze_and_send(args);
  } else {
    return rb_ensure(freeze_and_send, args, do_unfreeze, args);
  }
  return Qnil;
}

void Init_const_method(void) {
  rb_define_global_function("const_send", ruby_const_send, -2);
}

