Skip to content

Commit ea19e3b

Browse files
committed
Support for different rubies
1 parent 054aff9 commit ea19e3b

File tree

4 files changed

+20
-4
lines changed

4 files changed

+20
-4
lines changed

Diff for: lib/contracts/engine.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class << self
1414
# .apply(klass) - enables contracts engine on klass
1515
# .applied?(klass) - returns true if klass has contracts engine
1616
# .fetch_from(klass) - returns contracts engine for klass
17-
delegate [:apply, :applied?, :fetch_from] => :base_engine
17+
def_delegators :base_engine, :apply, :applied?, :fetch_from
1818

1919
private
2020

Diff for: lib/contracts/engine/base.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ def eigenclass
121121
end
122122

123123
def eigenclass_engine
124-
Engine.fetch_from(eigenclass)
124+
Eigenclass.lift(eigenclass, klass)
125125
end
126126

127127
def decorators

Diff for: lib/contracts/engine/eigenclass.rb

+16
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,22 @@ class Eigenclass < Base
66
# Class that owns this eigenclass
77
attr_accessor :owner_class
88

9+
# Automatically enables eigenclass engine if it is not
10+
# Returns its engine
11+
# NOTE: Required by jruby in 1.9 mode. Otherwise inherited
12+
# eigenclasses don't have their engines
13+
#
14+
# @param [Class] eigenclass - class in question
15+
# @param [Class] owner - owner of eigenclass
16+
# @return [Engine::Eigenclass]
17+
def self.lift(eigenclass, owner)
18+
return Engine.fetch_from(eigenclass) if Engine.applied?(eigenclass)
19+
20+
Target.new(eigenclass).apply(Eigenclass)
21+
Engine.fetch_from(owner).set_eigenclass_owner
22+
Engine.fetch_from(eigenclass)
23+
end
24+
925
# No-op for eigenclasses
1026
def set_eigenclass_owner
1127
end

Diff for: lib/contracts/engine/target.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ def apply(engine_class = Base)
2121

2222
apply_to_eigenclass
2323

24-
target.class_eval do
25-
define_singleton_method(:__contracts_engine) do
24+
eigenclass.class_eval do
25+
define_method(:__contracts_engine) do
2626
@__contracts_engine ||= engine_class.new(self)
2727
end
2828
end

0 commit comments

Comments
 (0)