coderrr-mixico 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. data/README.markdown +6 -0
  2. data/lib/mixico.rb +69 -0
  3. data/test/mixico_test.rb +35 -0
  4. metadata +64 -0
data/README.markdown ADDED
@@ -0,0 +1,6 @@
1
+ Mixico
2
+ ======
3
+
4
+ This is a simple refactoring of why's mixico (http://github.com/why/mixico) to make it work with ruby 1.8.6. It has also been changed to use RubyInline to compile on the fly.
5
+
6
+ You can install the gem by clicking the rubygem icon above.
data/lib/mixico.rb ADDED
@@ -0,0 +1,69 @@
1
+ require 'rubygems'
2
+ require 'inline'
3
+
4
+ class Module
5
+ inline do |builder|
6
+ builder.c %q{
7
+ static VALUE disable_mixin(VALUE super)
8
+ {
9
+ VALUE p, kid;
10
+ VALUE module = self;
11
+
12
+ Check_Type(super, T_MODULE);
13
+ for (kid = module, p = RCLASS(module)->super; p; kid = p, p = RCLASS(p)->super) {
14
+ if (BUILTIN_TYPE(p) == T_ICLASS) {
15
+ if (RBASIC(p)->klass == super) {
16
+ RCLASS(kid)->super = RCLASS(p)->super;
17
+ rb_clear_cache();
18
+ return p;
19
+ }
20
+ }
21
+ }
22
+
23
+ return Qnil;
24
+ }
25
+ }
26
+
27
+ builder.c %q{
28
+ static VALUE enable_mixin(VALUE mixin)
29
+ {
30
+ VALUE p;
31
+ VALUE module = self;
32
+
33
+ Check_Type(mixin, T_ICLASS);
34
+ Check_Type(RBASIC(mixin)->klass, T_MODULE);
35
+ for (p = module; p; p = RCLASS(p)->super) {
36
+ if (RCLASS(p)->super == RCLASS(mixin)->super) {
37
+ RCLASS(p)->super = mixin;
38
+ return RBASIC(mixin)->klass;
39
+ }
40
+ }
41
+
42
+ return Qnil;
43
+ }
44
+ }
45
+ end
46
+ end
47
+
48
+ class Proc
49
+ def mixin mod
50
+ eval('self', binding).extend mod
51
+ end
52
+
53
+ def mixout mod
54
+ (class << eval('self', binding); self end).disable_mixin mod
55
+ end
56
+ end
57
+
58
+ class Module
59
+ def mix_eval mod, *args, &blk
60
+ blk.mixin mod
61
+ begin
62
+ yield *args
63
+ ensure
64
+ blk.mixout mod
65
+ end
66
+ end
67
+
68
+ alias_method :mix_exec, :mix_eval
69
+ end
@@ -0,0 +1,35 @@
1
+ require 'test/unit'
2
+
3
+ require File.dirname(__FILE__) + "/../lib/mixico"
4
+
5
+ class MixicoTest < Test::Unit::TestCase
6
+ def setup
7
+ @p = Proc.new do
8
+ mixed_method
9
+ end
10
+
11
+ @m = Module.new do
12
+ def mixed_method
13
+ :im_mixed
14
+ end
15
+ end
16
+ end
17
+
18
+ def test_mixin
19
+ @p.mixin @m
20
+ assert_equal :im_mixed, @p.call
21
+ end
22
+
23
+ def test_mixout
24
+ @p.mixin @m
25
+ @p.mixout @m
26
+ assert_raises(NameError) { @p.call }
27
+ end
28
+
29
+ def test_mixout_after_call
30
+ @p.mixin @m
31
+ @p.call
32
+ @p.mixout @m
33
+ assert_raises(NameError) { @p.call }
34
+ end
35
+ end
metadata ADDED
@@ -0,0 +1,64 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: coderrr-mixico
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - coderrr
8
+ - why
9
+ autorequire: mixico
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2008-10-09 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies:
16
+ - !ruby/object:Gem::Dependency
17
+ name: RubyInline
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 3.6.7
24
+ version:
25
+ description: see http://github.com/why/mixico
26
+ email: coderrr.contact@gmail.com
27
+ executables: []
28
+
29
+ extensions: []
30
+
31
+ extra_rdoc_files: []
32
+
33
+ files:
34
+ - README.markdown
35
+ - mixico.gemspec
36
+ - lib/mixico.rb
37
+ has_rdoc: false
38
+ homepage: http://github.com/coderrr/mixico
39
+ post_install_message:
40
+ rdoc_options: []
41
+
42
+ require_paths:
43
+ - lib
44
+ required_ruby_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: "0"
49
+ version:
50
+ required_rubygems_version: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: "0"
55
+ version:
56
+ requirements: []
57
+
58
+ rubyforge_project:
59
+ rubygems_version: 1.2.0
60
+ signing_key:
61
+ specification_version: 2
62
+ summary: 1.8.6 compatible version of why's mixico
63
+ test_files:
64
+ - test/mixico_test.rb