-
Notifications
You must be signed in to change notification settings - Fork 4.1k
/
component.coffee
40 lines (33 loc) · 1.48 KB
/
component.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
utils = require 'core/utils'
componentKeywords = ['attach', 'constructor', 'validateArguments', 'toString', 'isComponent'] # Array is faster than object
module.exports = class Component
@className: 'Component'
isComponent: true
constructor: (config) ->
for key, value of config
@[key] = value # Hmm, might want to _.cloneDeep here? What if the config has nested object values and the Thang modifies them, then we re-use the config for, say, missile spawning? Well, for now we'll clone in the missile.
attach: (thang) ->
# Optimize; this is much of the World constructor time
keys = (Object.getOwnPropertyNames(@.__proto__) or []).concat(Object.getOwnPropertyNames(@))
for key in keys when key not in componentKeywords and key[0] isnt '_'
oldValue = thang[key]
value = @[key]
if typeof oldValue is 'function'
thang.appendMethod key, value
else
thang[key] = value
validateArguments:
additionalProperties: false
getCodeContext: (className) ->
className ?= @constructor.className
return unless @world?.levelComponents?.length
levelComponent = _.find @world.levelComponents, name: className
return unless levelComponent
context = levelComponent?.context or {}
language = @world.language or 'en-US'
localizedContext = utils.i18n(levelComponent, 'context', language)
if localizedContext
context = _.merge context, localizedContext
context
toString: ->
"<Component: #{@constructor.className}"