Attribute properties

Implements #101, #102 and #103. 
why is this necessary? if it's the same as specifying a function instead of an object