method
refine
v2_4_6 -
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->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;
} Related methods
- Instance methods
- <
- <=
- <=>
- ==
- ===
- >
- >=
- ancestors
- autoload
- autoload?
- class_eval
- class_exec
- class_variable_defined?
- class_variable_get
- class_variable_set
- class_variables
- const_defined?
- const_get
- const_missing
- const_set
- constants
- deprecate_constant
- freeze
- include
- include?
- included_modules
- initialize_clone
- initialize_copy
- inspect
- instance_method
- instance_methods
- method_defined?
- module_eval
- module_exec
- name
- prepend
- private_class_method
- private_constant
- private_instance_methods
- private_method_defined?
- protected_instance_methods
- protected_method_defined?
- psych_yaml_as
- public_class_method
- public_constant
- public_instance_method
- public_instance_methods
- public_method_defined?
- remove_class_variable
- singleton_class?
- to_s
- yaml_as
- Class methods
- constants
- nesting
- new
- used_modules
- Private methods
-
alias_method -
append_features -
attr -
attr_accessor -
attr_reader -
attr_writer -
define_method -
extend_object -
extended -
included -
method_added -
method_removed -
method_undefined -
module_function -
prepend_features -
prepended -
private -
protected -
public -
refine -
remove_const -
remove_method -
undef_method -
using