APIdock / Ruby
/
method

refine

v2_5_5 - Show latest stable - Class: Module
refine(p1)
private

Refine mod in the receiver.

Returns a module, where refined methods are defined.

static VALUE
rb_mod_refine(VALUE module, VALUE klass)
{
 VALUE refinement;
 ID id_refinements, id_activated_refinements,
 id_refined_class, id_defined_at;
 VALUE refinements, activated_refinements;
 rb_thread_t *th = GET_THREAD();
 VALUE block_handler = rb_vm_frame_block_handler(th->ec->cfp);
 if (block_handler == VM_BLOCK_HANDLER_NONE) {
 rb_raise(rb_eArgError, "no block given");
 }
 if (vm_block_handler_type(block_handler) != block_handler_type_iseq) {
 rb_raise(rb_eArgError, "can't pass a Proc as a block to Module#refine");
 }
 ensure_class_or_module(klass);
 CONST_ID(id_refinements, "__refinements__");
 refinements = rb_attr_get(module, id_refinements);
 if (NIL_P(refinements)) {
 refinements = hidden_identity_hash_new();
 rb_ivar_set(module, id_refinements, refinements);
 }
 CONST_ID(id_activated_refinements, "__activated_refinements__");
 activated_refinements = rb_attr_get(module, id_activated_refinements);
 if (NIL_P(activated_refinements)) {
 activated_refinements = hidden_identity_hash_new();
 rb_ivar_set(module, id_activated_refinements,
 activated_refinements);
 }
 refinement = rb_hash_lookup(refinements, klass);
 if (NIL_P(refinement)) {
 VALUE superclass = refinement_superclass(klass);
 refinement = rb_module_new();
 RCLASS_SET_SUPER(refinement, superclass);
 FL_SET(refinement, RMODULE_IS_REFINEMENT);
 CONST_ID(id_refined_class, "__refined_class__");
 rb_ivar_set(refinement, id_refined_class, klass);
 CONST_ID(id_defined_at, "__defined_at__");
 rb_ivar_set(refinement, id_defined_at, module);
 rb_hash_aset(refinements, klass, refinement);
 add_activated_refinement(activated_refinements, klass, refinement);
 }
 rb_yield_refine_block(refinement, activated_refinements);
 return refinement;
}

AltStyle によって変換されたページ (->オリジナル) /