ducktape 0.0.1 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/ducktape/bindable.rb +21 -5
  2. metadata +3 -3
@@ -1,4 +1,10 @@
1
1
  module Ducktape
2
+ class AttributeNotDefinedError < StandardError
3
+ def initialize(klass, name)
4
+ super("attribute #{name.to_s.inspect} not defined for class #{klass}")
5
+ end
6
+ end
7
+
2
8
  module Bindable
3
9
  module ClassMethods
4
10
  def inherited(child)
@@ -9,9 +15,9 @@ module Ducktape
9
15
  def bindable(name, options = {})
10
16
  name = name.to_s
11
17
  m = BindableAttributeMetadata.new(metadata(name) || name, options)
12
- @bindings_metadata[name.to_s] = m
13
- define_method name, ->{get_bindable_attr(name).value} if !options.has_key?(:readable) or options[:readable]
14
- define_method "#{name}=", ->(value){get_bindable_attr(name).value = value} if !options.has_key?(:writable) or options[:writable]
18
+ @bindings_metadata[name] = m
19
+ define_method name, ->() { get_value(name) } unless options[:access] == :writeonly
20
+ define_method "#{name}=", ->(value) { set_value(name, value) } unless options[:access] == :readonly
15
21
  nil
16
22
  end
17
23
 
@@ -47,7 +53,7 @@ module Ducktape
47
53
 
48
54
  def on_changed(attr_name, &block)
49
55
  return nil unless block
50
- get_bindable_attr(attr_name.to_s).send(:on_changed, &block)
56
+ get_bindable_attr(attr_name.to_s).on_changed(&block)
51
57
  block
52
58
  end
53
59
 
@@ -57,13 +63,23 @@ module Ducktape
57
63
  block
58
64
  end
59
65
 
66
+ protected
67
+ def get_value(attr_name)
68
+ get_bindable_attr(attr_name.to_s).value
69
+ end
70
+
71
+ def set_value(attr_name, value)
72
+ get_bindable_attr(attr_name.to_s).value = value
73
+ end
74
+
60
75
  private
61
76
  def bindable_attrs
62
77
  @bindable_attrs ||= {}
63
78
  end
64
79
 
65
80
  def get_bindable_attr(name)
66
- bindable_attrs[name.to_s] ||= BindableAttribute.new(self, name.to_s)
81
+ raise AttributeNotDefinedError.new(self.class, name.to_s) unless metadata(name)
82
+ bindable_attrs[name.to_s] ||= BindableAttribute.new(self, name)
67
83
  end
68
84
  end
69
85
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ducktape
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2012-04-28 00:00:00.000000000 Z
13
+ date: 2012-04-30 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description: Truly outrageous bindable attributes
16
16
  email:
@@ -46,7 +46,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
46
46
  version: '0'
47
47
  requirements: []
48
48
  rubyforge_project:
49
- rubygems_version: 1.8.11
49
+ rubygems_version: 1.8.24
50
50
  signing_key:
51
51
  specification_version: 3
52
52
  summary: Truly outrageous bindable attributes