Slide 1

Slide 1 text

Konstantin Tennhard Ruby developer at flinc.org Hi, I'm … @t6d github.com/t6d [email protected]

Slide 2

Slide 2 text

Accessors & Plain-old Ruby classes … and I'll talk about

Slide 3

Slide 3 text

class Message attr_reader :subject def initialize(attrs = {}) self.subject = attrs[:subject] end def subject=(value) unless value raise ArgumentError, "No subject given" end value = value.to_s if value.length < 3 raise ArgumentError, "Invalid subject" end @subject = value end end attr_accessor •Doesn't always do the job •No conversion •No validation •No support for default values •No support for not-nil constraint •Results in tedious work you have to do OVER AND OVER again

Slide 4

Slide 4 text

What can we do? How can we DRY this out?

Slide 5

Slide 5 text

SmartProperties Slim, DRY, and easy to use …

Slide 6

Slide 6 text

require 'smart_properties' class Message include SmartProperties property :subject, :required => true, :converts => :to_s, :accepts => lambda { |s| s.length >= 3 } end SmartProperties •Features •Conversion •Validation •Default values •Not-nil constraint •Simple Interface

Slide 7

Slide 7 text

require 'smart_properties' class Message include SmartProperties property :subject, :required => true, :converts => :to_s, :accepts => lambda { |s| s.length >= 3 } def subject subject = super # do something amazing … end end SmartProperties •Advanced features •Overriding methods

Slide 8

Slide 8 text

SmartProperties github.com/t6d/smart_properties

Slide 9

Slide 9 text

Thanks! Are there any questions?