Class: Type

Inherits:
Object show all
Defined in:
lib/carat-dev/interface_work/type.rb

Defined Under Namespace

Classes: TypeRepositoryError, TypeSignitureError, TypeValidationError

Constant Summary collapse

@@repository =

def Type.repository

{}

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, responders, &validator) ⇒ Type

Returns a new instance of Type.



108
109
110
111
112
113
# File 'lib/carat-dev/interface_work/type.rb', line 108

def initialize(name, responders, &validator)
  @name = name
  @responders = responders
  @validator = validator
  Type.add(self)
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



107
108
109
# File 'lib/carat-dev/interface_work/type.rb', line 107

def name
  @name
end

#respondersObject (readonly)

Returns the value of attribute responders.



107
108
109
# File 'lib/carat-dev/interface_work/type.rb', line 107

def responders
  @responders
end

#validatorObject (readonly)

Returns the value of attribute validator.



107
108
109
# File 'lib/carat-dev/interface_work/type.rb', line 107

def validator
  @validator
end

Class Method Details

.[](name) ⇒ Object



104
105
106
# File 'lib/carat-dev/interface_work/type.rb', line 104

def Type.[](name)
  @@repository[name]
end

.add(t) ⇒ Object

end



100
101
102
103
# File 'lib/carat-dev/interface_work/type.rb', line 100

def Type.add(t)
  raise TypeRepositoryError if !t.kind_of?(Type)
  @@repository[t.name] = t
end

Instance Method Details

#check(obj) ⇒ Object



133
134
135
136
# File 'lib/carat-dev/interface_work/type.rb', line 133

def check(obj)
  ensigniate(obj)
  validate(obj)
end

#check?(obj) ⇒ Boolean

Returns:

  • (Boolean)


130
131
132
# File 'lib/carat-dev/interface_work/type.rb', line 130

def check?(obj)
  ensign?(obj) && valid?(obj)
end

#ensign?(obj) ⇒ Boolean

Returns:

  • (Boolean)


114
115
116
# File 'lib/carat-dev/interface_work/type.rb', line 114

def ensign?(obj)
  @responders.all? { |r| @r = r; obj.send(:respond_to?, r) }
end

#ensigniate(obj) ⇒ Object



117
118
119
120
121
# File 'lib/carat-dev/interface_work/type.rb', line 117

def ensigniate(obj)
  unless ensign?(obj)
    raise TypeSignitureError, "#{self.name} #{obj} (#{@r})"
  end
end

#valid?(obj) ⇒ Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/carat-dev/interface_work/type.rb', line 122

def valid?(obj)
  @validator ? @validator.call(obj) : true
end

#validate(obj) ⇒ Object



125
126
127
128
129
# File 'lib/carat-dev/interface_work/type.rb', line 125

def validate(obj)
  unless valid?(obj)
    raise TypeValidationError, "#{self.name} #{obj}"
  end
end