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)


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

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?



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
206
# File 'lib/nrser/meta/props.rb', line 177

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 "      Prop \#{ name.inspect } already set for \#{ self }:\n      \#{ ref[name].inspect }\n    END\n  end\n  \n  prop = Prop.new self, name, **opts\n  ref[name] = prop\n  \n  unless prop.source?\n    class_eval do\n      define_method(name) do\n        prop.get self\n      end\n      \n      # protected\n      #   define_method(\"\#{ name }=\") do |value|\n      #     prop.set self, value\n      #   end\n    end\n  end\n  \n  prop\nend\n"

#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:



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

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