Add another init_arg example
[gitmo/moose-presentations.git] / moose-class / slides / outline
1 = Intro (30 minutes)
2
3 * concepts (ala Moose::Manual::Concepts)
4
5 = Classes
6
7 * Making a class use Moose
8 * extends
9 * overrides/super
10 * trivial attributes
11 ** has 'foo' => ( is => ... ) (ro & rw)
12 ** no other attribute features yet
13 * "no Moose"
14 * Immutability
15
16 == Exercises
17
18 * Build a Person class that uses Moose
19 ** first_name
20 ** last_name
21 ** assume both attributes are always provided
22 * build an Employee class that is a subclass of Person
23 ** job_title
24
25 = Roles
26
27 * Making a role
28 * roles as interfaces
29 * requires
30 * consuming roles in classes
31 * consuming roles in roles
32 * "no Moose::Role"
33
34 == Exercises
35
36 * build a role for Human
37 * make the Person class consume the role
38 * make the role require a "full_name" method
39 * implement this method for Person
40 * override it for Employee to include their title
41
42 = Basic attributes
43
44 * required
45 * default & builder
46 * lazy
47 * predicate, clearer
48 * init_arg
49 * reader & writer
50 * attribute inheritance
51 * MX attribute naming modules
52
53 == Exercises
54
55 * Go back to Person class
56 ** make first & last name required
57 * Go back to Employee
58 ** make title default to "Worker"
59 ** add predicate & clearer for title
60 ** add salary_level attribute, number from 1-10
61 ** salary, lazy default of salary_level * 1,000, init_arg is undef
62
63 = Method modifiers
64
65 * before/after
66 ** before for state validation
67 ** after for additional state changes
68 * around
69 ** modifying arguments & return values
70 * method modifiers in roles
71 ** requiring the wrapped method
72 * augment/inner
73
74 == Exercises
75
76 = Types
77
78 * built-in types
79 * parameterizable types
80 * declaring subtypes
81 ** URI
82 ** Email
83 ** class names & role names
84 * coercions
85 * duck_type
86 * attribute isa & does
87 * attribute coerce => 1
88 * MX::Types
89
90 == Exercises
91
92 * Add sane types to all existing attributes in Person, Employee, roles
93 * Add an email attribute. Make a new email type that does some minimal validate like /[^@]+\@[\w\-]+(?:\.[\w\-]+)+/
94
95 = Advanced attributes
96
97 * weak_ref
98 * triggers
99 * delegation
100 * metaclass & traits
101
102 == Exercises
103
104 * Make the bank account a proper object and delegate to it for deposit & withdraw
105 * Add an overdraft account like in the cookbook
106 * Make the overdraft account link bank to accounts which link to it as a weak_ref
107 * metaclass & traits?
108
109 = Introspection
110
111 * List of attributes for a class
112 ** attribute options
113 ** associated methods
114 * List of methods for a class
115 ** associated attributes
116 ** check original_package for source of method (did it come from a role?)
117 ** $method->isa(...) to determine if it's wrapped/augmented/overridden
118 * List of parent classes, subclasses
119
120 = Tour of MooseX
121
122 * MX::AH
123 ** delegation for Perl built-ins
124 ** private accessor with public provides (_options as the attribute, get_option, set_option, options_list)
125 ** lazy default of an empty reference
126 * ::StrictConstructor
127 * ::Getopt
128 * ::Clone
129 * ::Declare
130 * ::Workers ?
131 * ::NonMoose
132 * ::Singleton
133 * ::ClassAttribute
134
135 = Writing a MooseX Module
136
137 == Exercises