added Dumm.method_missing, allows direct invocation of guests/bridges
This commit is contained in:
parent
cf61575dc3
commit
8a7d32452c
|
@ -92,7 +92,9 @@ static VALUE guest_find(VALUE class, VALUE key)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
guest_t *guest, *found = NULL;
|
guest_t *guest, *found = NULL;
|
||||||
if (TYPE(key) == T_SYMBOL) {
|
|
||||||
|
if (TYPE(key) == T_SYMBOL)
|
||||||
|
{
|
||||||
key = rb_convert_type(key, T_STRING, "String", "to_s");
|
key = rb_convert_type(key, T_STRING, "String", "to_s");
|
||||||
}
|
}
|
||||||
enumerator = dumm->create_guest_enumerator(dumm);
|
enumerator = dumm->create_guest_enumerator(dumm);
|
||||||
|
@ -255,7 +257,9 @@ static VALUE guest_find_iface(VALUE self, VALUE key)
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
iface_t *iface, *found = NULL;
|
iface_t *iface, *found = NULL;
|
||||||
guest_t *guest;
|
guest_t *guest;
|
||||||
if (TYPE(key) == T_SYMBOL) {
|
|
||||||
|
if (TYPE(key) == T_SYMBOL)
|
||||||
|
{
|
||||||
key = rb_convert_type(key, T_STRING, "String", "to_s");
|
key = rb_convert_type(key, T_STRING, "String", "to_s");
|
||||||
}
|
}
|
||||||
Data_Get_Struct(self, guest_t, guest);
|
Data_Get_Struct(self, guest_t, guest);
|
||||||
|
@ -355,11 +359,15 @@ static void guest_init()
|
||||||
/**
|
/**
|
||||||
* Bridge binding
|
* Bridge binding
|
||||||
*/
|
*/
|
||||||
static VALUE bridge_get(VALUE class, VALUE key)
|
static VALUE bridge_find(VALUE class, VALUE key)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
bridge_t *bridge, *found = NULL;
|
bridge_t *bridge, *found = NULL;
|
||||||
|
|
||||||
|
if (TYPE(key) == T_SYMBOL)
|
||||||
|
{
|
||||||
|
key = rb_convert_type(key, T_STRING, "String", "to_s");
|
||||||
|
}
|
||||||
enumerator = dumm->create_bridge_enumerator(dumm);
|
enumerator = dumm->create_bridge_enumerator(dumm);
|
||||||
while (enumerator->enumerate(enumerator, &bridge))
|
while (enumerator->enumerate(enumerator, &bridge))
|
||||||
{
|
{
|
||||||
|
@ -372,11 +380,21 @@ static VALUE bridge_get(VALUE class, VALUE key)
|
||||||
enumerator->destroy(enumerator);
|
enumerator->destroy(enumerator);
|
||||||
if (!found)
|
if (!found)
|
||||||
{
|
{
|
||||||
rb_raise(rb_eRuntimeError, "bridge not found");
|
return Qnil;
|
||||||
}
|
}
|
||||||
return Data_Wrap_Struct(class, NULL, NULL, found);
|
return Data_Wrap_Struct(class, NULL, NULL, found);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static VALUE bridge_get(VALUE class, VALUE key)
|
||||||
|
{
|
||||||
|
VALUE bridge = bridge_find(class, key);
|
||||||
|
if (NIL_P(bridge))
|
||||||
|
{
|
||||||
|
rb_raise(rb_eRuntimeError, "bridge not found");
|
||||||
|
}
|
||||||
|
return bridge;
|
||||||
|
}
|
||||||
|
|
||||||
static VALUE bridge_each(int argc, VALUE *argv, VALUE class)
|
static VALUE bridge_each(int argc, VALUE *argv, VALUE class)
|
||||||
{
|
{
|
||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
|
@ -468,6 +486,8 @@ static void bridge_init()
|
||||||
rb_define_singleton_method(rbc_bridge, "[]", bridge_get, 1);
|
rb_define_singleton_method(rbc_bridge, "[]", bridge_get, 1);
|
||||||
rb_define_singleton_method(rbc_bridge, "each", bridge_each, -1);
|
rb_define_singleton_method(rbc_bridge, "each", bridge_each, -1);
|
||||||
rb_define_singleton_method(rbc_bridge, "new", bridge_new, 1);
|
rb_define_singleton_method(rbc_bridge, "new", bridge_new, 1);
|
||||||
|
rb_define_singleton_method(rbc_bridge, "include?", bridge_find, 1);
|
||||||
|
rb_define_singleton_method(rbc_bridge, "bridge?", bridge_find, 1);
|
||||||
|
|
||||||
rb_define_method(rbc_bridge, "to_s", bridge_to_s, 0);
|
rb_define_method(rbc_bridge, "to_s", bridge_to_s, 0);
|
||||||
rb_define_method(rbc_bridge, "each", bridge_each_iface, -1);
|
rb_define_method(rbc_bridge, "each", bridge_each_iface, -1);
|
||||||
|
|
|
@ -19,6 +19,18 @@ require 'dumm.so'
|
||||||
require 'dumm/guest'
|
require 'dumm/guest'
|
||||||
|
|
||||||
module Dumm
|
module Dumm
|
||||||
|
|
||||||
|
# use guest/bridge indentifiers directly
|
||||||
|
def method_missing(id, *args)
|
||||||
|
if Guest.guest? id
|
||||||
|
return Guest[id]
|
||||||
|
end
|
||||||
|
if Bridge.bridge? id
|
||||||
|
return Bridge[id]
|
||||||
|
end
|
||||||
|
super(id, *args)
|
||||||
|
end
|
||||||
|
|
||||||
# unload templates, reset all guests and delete bridges
|
# unload templates, reset all guests and delete bridges
|
||||||
def reset
|
def reset
|
||||||
Template.unload
|
Template.unload
|
||||||
|
|
Loading…
Reference in New Issue