Module: NRSER::Meta::Props::ClassMethods

Defined in:
lib/nrser/meta/props.rb

Overview

Methods added to the including class via ‘extend`.

Instance Method Summary collapse

Instance Method Details

#from_data(data) ⇒ self

TODO:

This needs to be extended to handle prop’d classes nested in arrays and hashes… but for the moment, it is what it is.

Instantiate from a data hash.

Parameters:

  • data (Hash<String, Object>)

Returns:

  • (self)


218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
# File 'lib/nrser/meta/props.rb', line 218

def from_data data
  values = {}
  props = self.props
  
  data.each { |data_key, data_value|
    prop_key = case data_key
    when Symbol
      data_key
    when String
      data_key.to_sym
    end
    
    if  prop_key &&
        prop = props[prop_key]
      values[prop_key] = prop.value_from_data data_value
    end
  }
  
  self.new values
end

#prop(name, **opts) ⇒ NRSER::Meta::Props::Prop

Define a property.

Parameters:

  • name (Symbol)

    The name of the property.

  • **opts (Hash{ Symbol => Object })

    Constructor options for Prop.

Returns:

  • (NRSER::Meta::Props::Prop)

    The newly created prop, thought you probably don’t need it (it’s already all bound up on the class at this point), but why not?



176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
# File 'lib/nrser/meta/props.rb', line 176

def prop name, **opts
  ref = NRSER::Meta::Props.get_props_ref self
  
  t.sym.check name
  
  if ref.key? name
    raise ArgumentError.new NRSER.squish <<-END
      Prop #{ name.inspect } already set for #{ self }:
      #{ ref[name].inspect }
    END
  end
  
  prop = Prop.new self, name, **opts
  ref[name] = prop
  
  unless prop.source?
    class_eval do
      define_method(name) do
        prop.get self
      end
      
      # protected
      #   define_method("#{ name }=") do |value|
      #     prop.set self, value
      #   end
    end
  end
  
  prop
end

#props(only_own: false, only_primary: false) ⇒ Hash{ Symbol => NRSER::Meta::Props::Prop }

Get a map of property names to property instances.

Parameters:

  • only_own: (Boolean) (defaults to: false)

    Don’t include super-class properties.

  • only_primary: (Boolean) (defaults to: false)

    Don’t include properties that have a Prop#source.

Returns:



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# File 'lib/nrser/meta/props.rb', line 141

def props only_own: false, only_primary: false
  result = if !only_own && superclass.respond_to?(:props)
    superclass.props only_own: only_own, only_primary: only_primary
  else
    {}
  end
  
  own_props = NRSER::Meta::Props.get_props_ref self
  
  if only_primary
    own_props.each {|name, prop|
      if prop.primary?
        result[name] = prop
      end
    }
  else
    result.merge! own_props
  end
  
  result
end