import moose website
[gitmo/moose-htdocs.git] / Moose_YAPC_Asia_2008 / .practical_moose.s5.swp
CommitLineData
720accfe 1b0VIM 7.1\0\0\0\0\10\0\0ÜÓ7H¸Ò´\0Aj\0\0nothingmuch\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0syeeda.local\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0~nothingmuch/Perl/moose/talks/Moose_YAPC_Asia_2008/practical_moose.s5\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0utf-8\r\03210#"! \13\12U\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0tp\b\0ÿ\0\0\0\b\0\0\0L\0\0\0Ê\ 3\0\0\ 1\0\0\0\ 4\0\0\0™\0\0\0u\ 4\0\0\ 1\0\0\0 \0\0\0¬\0\0\0\ e\ 5\0\0\ 1\0\0\0\ 5\0\0\0¨\0\0\0º\ 5\0\0\ 1\0\0\0\ 6\0\0\0°\0\0\0b\ 6\0\0\ 1\0\0\0\a\0\0\0Ž\0\0\0\12\a\0\0\ 1\0\0\0\ 3\0\0\0‘\0\0\0 \a\0\0\ 1\0\0\0
2\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
3\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
4\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
5\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
6\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
7\0\0\0 \0\0\01\b\0\0\ 1\0\0\0
8\0\0\0 \0\0\01\b\0\0\ 1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0ad\0\0;\0\0\0ï\ 2\0\0\0\10\0\0¨\0\0\0ì\ f\0\0Í\ f\0\0²\ f\0\0Ÿ\ f\0\0‹\ f\0\0Š\ f\0\0}\ f\0\0p\ f\0\0o\ f\0\0`\ f\0\0X\ f\0\08\ f\0\0&\ f\0\0\13\ f\0\0\0\ f\0\0ÿ\ e\0\0¤\ e\0\0£\ e\0\0š\ e\0\0‘\ e\0\0\ e\0\0b\ e\0\0a\ e\0\0\ 6\ e\0\0\ 5\ e\0\0ü\r\0\0ó\r\0\0ò\r\0\0Ï\r\0\0¿\r\0\0˜\r\0\0ˆ\r\0\0r\r\0\0e\r\0\0[\r\0\0?\r\0\0)\r\0\0(\r\0\0Í\f\0\0Ì\f\0\0»\f\0\0ª\f\0\0©\f\0\0\f\0\0\f\0\0Œ\f\0\0€\f\0\0r\f\0\0q\f\0\0g\f\0\0Q\f\0\0P\f\0\0=\f\0\0)\f\0\0\12\f\0\0\ 3\f\0\0\ 1\f\0\0\0\f\0\0õ\v\0\0Ù\v\0\0³\v\0\0—\v\0\0•\v\0\0”\v\0\0Š\v\0\0o\v\0\0L\v\0\00\v\0\0.\v\0\0-\v\0\0*\v\0\0\1c\v\0\0\e\v\0\0À
9\0\0¿
10\0\0¨
11\0\0‘
12\0\0
13\0\0„
14\0\0t
15\0\0i
16\0\0h
17\0\0N
18\0\04
19\0\03
20\0\00
21\0\0"
22\0\0!
23\0\0Æ \0\0Å \0\0¦ \0\0‡ \0\0† \0\0v \0\0_ \0\0= \0\0\10 \0\0\ f \0\0´\b\0\0³\b\0\0”\b\0\0u\b\0\0t\b\0\0X\b\0\0>\b\0\0\13\b\0\0é\a\0\0Ð\a\0\0Ï\a\0\0¨\a\0\0§\a\0\0¦\a\0\0›\a\0\0š\a\0\0_\a\0\0^\a\0\0\ 3\a\0\0\ 2\a\0\0ä\ 6\0\0Æ\ 6\0\0Å\ 6\0\0¹\ 6\0\0¨\ 6\0\0\ 6\0\0œ\ 6\0\0Ž\ 6\0\0}\ 6\0\0l\ 6\0\0W\ 6\0\0T\ 6\0\0S\ 6\0\0D\ 6\0\0/\ 6\0\0\14\ 6\0\0\ 2\ 6\0\0Ö\ 5\0\0Ó\ 5\0\0Å\ 5\0\0º\ 5\0\0¹\ 5\0\0§\ 5\0\0¦\ 5\0\0K\ 5\0\0J\ 5\0\0$\ 5\0\0þ\ 4\0\0ý\ 4\0\0ì\ 4\0\0×\ 4\0\0­\ 4\0\0~\ 4\0\0}\ 4\0\0c\ 4\0\03\ 4\0\0\1c\ 4\0\0\e\ 4\0\0\10\ 4\0\0þ\ 3\0\0ý\ 3\0\0×\ 3\0\0Ö\ 3\0\0{\ 3\0\0z\ 3\0\0T\ 3\0\0.\ 3\0\0-\ 3\0\0\14\ 3\0\0ï\ 2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 * `Moose::Util::TypeConstraints`\0* `isa` specifies a type\0\0=====================================\0Variations on a Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0non refs make accidental sharing hard\0\0discusses default\0##########\0\0 * not inside `new`\0 * called on first usage of `$object->staff`\0* `lazy` delays `default`\0\0 * used when no parameter is given to `new`\0 * or non-reference (numbers, strings)\0 * code reference\0* `default` is a\0\0=====================================\0Variations on a Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Adds default, isa\0\0##########\0</code></pre>\0);\0 default => sub { [qw(Bob Alice Tim)] },\0 lazy => 1,\0 isa => 'ArrayRef',\0 is => 'ro',\0has staff => (\0\0);\0 default => 'Bob'\0 isa => 'Str'\0 is => 'rw', \0has name => (\0\0use Moose;\0package Manager;\0<pre><code>\0\0=============================\0Variations on a Moose Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Now we're going to discuss more features of the attributes\0\0##########\0\0\0* `new` inherited from `Moose::Object`\0\0 * `writer`, `reader`\0 * `is => 'ro'` → read only accessor\0 * `is => 'rw'` → read/write accessor\0 * generates accessors\0* `has` declares attributes\0\0==============================\0A Simple Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * `@ISA = qw(Moose::Object) unless @ISA`\0 * `use strict; use warnings;`\0 * imports keywords\0* `use Moose;` \0\0==============================\0A Simple Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\01;\0\0has age => (is => 'rw');\0has name => (is => 'rw');\0\0use Moose;\0package Person;\0<pre><code>\0\0======================\0A Simple Moose Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\01;\0\0}\0 return $self->{'age'}; \0 $self->{'age'} = $age if $age;\0 my ($self, $age) = @_;\0sub age {\0\0}\0 return $self->{'name'};\0 $self->{'name'} = $name if $name;\0 my ($self, $name) = @_;\0sub name {\0\0}\0 }, $class;\0 age => undef,\0 name => '',\0 return bless {\0\0 my ($class) = @_;\0sub new {\0\0use warnings;\0use strict;\0\0package Person;\0<pre><code>\0\0================\0A Simple Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Polite, incremental\0* Stable & Production ready\0 * …\0 * Perl 6\0 * Alces latifrons\0 * Smalltalk\0 * CLOS (Common Lisp Object System)\0* Rich ancestry\0* Syntactic Sugar for `Class::MOP`\0\0========\0Moose Is\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* A complete modern object framework for Perl\0\0========\0Moose Is\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Perl 6 in Perl 5\0* Perl black magic\0* A source filter\0* Just another accessor builder\0* A toy\0* Experimental\0\0============\0Moose Is Not\0\0Theme: moose\0Date: 2008\0Presenter: Yuval Kogman\0Location: YAPC::Asia::2008\0Title: Moose\0ad\0\0\ 3\0\0\0[\ 2\0\0\0\10\0\0‘\0\0\0Ò\ f\0\0¤\ f\0\0£\ f\0\0H\ f\0\0G\ f\0\05\ f\0\0#\ f\0\0"\ f\0\0\ f\ f\0\0ð\ e\0\0Ý\ e\0\0Ë\ e\0\0¸\ e\0\0®\ e\0\0­\ e\0\0R\ e\0\0Q\ e\0\07\ e\0\0\1d\ e\0\0\1c\ e\0\0\12\ e\0\0÷\r\0\0Ô\r\0\0Á\r\0\0À\r\0\0e\r\0\0d\r\0\0J\r\0\00\r\0\0/\r\0\0 \r\0\0\0\r\0\0Î\f\0\0«\f\0\0|\f\0\0E\f\0\0D\f\0\0é\v\0\0è\v\0\0Î\v\0\0´\v\0\0³\v\0\0£\v\0\0w\v\0\0V\v\0\0U\v\0\0ú
24\0\0ù
25\0\0ß
26\0\0Å
27\0\0Ä
28\0\0­
29\0\0“
30\0\0v
31\0\0R
32\0\0Q
33\0\0ö \0\0õ \0\0Û \0\0Á \0\0À \0\0« \0\0€ \0\0a \0\0K \0\0J \0\0ï\b\0\0î\b\0\0ß\b\0\0Ð\b\0\0Ï\b\0\0t\b\0\0s\b\0\0k\b\0\0c\b\0\0b\b\0\0V\b\0\0@\b\0\0/\b\0\0\e\b\0\0\1a\b\0\0ð\a\0\0Æ\a\0\0œ\a\0\0r\a\0\0H\a\0\0G\a\0\0 \a\0\0\ 2\a\0\0ÿ\ 6\0\0ñ\ 6\0\0ð\ 6\0\0•\ 6\0\0”\ 6\0\0„\ 6\0\0t\ 6\0\0s\ 6\0\0g\ 6\0\0U\ 6\0\0)\ 6\0\0(\ 6\0\0ô\ 5\0\0¼\ 5\0\0„\ 5\0\0M\ 5\0\0\15\ 5\0\0\a\ 5\0\0\ 6\ 5\0\0«\ 4\0\0ª\ 4\0\0ž\ 4\0\0’\ 4\0\0‘\ 4\0\0o\ 4\0\0n\ 4\0\0b\ 4\0\0'\ 4\0\0\19\ 4\0\0\18\ 4\0\0ð\ 3\0\0á\ 3\0\0à\ 3\0\0…\ 3\0\0„\ 3\0\0x\ 3\0\0l\ 3\0\0k\ 3\0\0_\ 3\0\0N\ 3\0\0=\ 3\0\0\1f\ 3\0\0\1e\ 3\0\0\ f\ 3\0\0ó\ 2\0\0á\ 2\0\0Ð\ 2\0\0£\ 2\0\0 \ 2\0\0Ÿ\ 2\0\0“\ 2\0\0~\ 2\0\0}\ 2\0\0^\ 2\0\0\\ 2\0\0[\ 2\0\0\0\0\0\0}\0 $self->yield('increment');\0\0 my ($self) = @_;\0sub START {\0\0);\0 provides => { inc => "increment_count"},\0 is => 'rw',\0 isa => 'Int',\0 metaclass => "Counter",\0has count => (\0\0use MooseX::AttributeHelpers;\0use MooseX::POE;\0package Counter;\0<pre><code>\0\0===========\0MooseX::POE\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Nice for IRC\0* Useful for testing if something works\0\0</code></pre>\0perl -Moose -e'has foo => (is=>q[rw]); Class->new(foo=>1)'\0<pre><code>\0\0* Moose One Liners with `oose.pm`\0\0===========\0perl -Moose\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0is(2->terabytes, 2199023255552, '... got 2 terabytes');\0is(1->gigabytes, 1073741824, '... got 1 gigabyte');\0is(2->megabytes, 2097152, '... got 2 megabytes');\0is(5->kilobytes, 5120, '... got 5 kilobytes');\0is(5->bytes, 5, '... got 5 bytes');\0\0use Moose::Autobox; # autoboxing is lexical\0use Units::Bytes;\0<pre><code>\0\0===============\0Autobox (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0);\0 SCALAR => 'Units::Bytes',\0Moose::Autobox->mixin_additional_role(\0\0sub terabytes { $_[0] * 1024->gigabytes }\0sub gigabytes { $_[0] * 1024->megabytes }\0sub megabytes { $_[0] * 1024->kilobytes }\0sub kilobytes { $_[0] * 1024 }\0sub bytes { $_[0] }\0\0use Moose::Autobox;\0use Moose::Role;\0package Units::Bytes;\0<pre><code>\0\0=======\0Autobox\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0==============\0Bonus Material\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Ruby is so 2007\0 * Smart sounding buzzwords\0 * All the cool kids hang out on #moose\0* It's the new black\0\0=========================\0Benefits of Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Enables powerful abstractions\0 * Provides introspection\0 * Cleans up Perl's OO\0* Meta object protocol\0\0=========================\0Benefits of Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * good signal to noise ratio\0 * declarative style is self documenting\0* More readable\0\0=========================\0Benefits of Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * http://c2.com/cgi/wiki?IntentionNotAlgorithm\0 * not that it is "assembled" correctly\0 * focus on your code's purpose\0 * no need to check accessor behavior, etc\0 * Moose is very well tested\0* Less testing\0\0=========================\0Benefits of Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * no RSI ;-)\0 * less code means fewer bugs\0 * concise, condensed\0* Shorter\0\0=========================\0Benefits of Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * …\0 * verification\0 * destruction\0 * construction\0 * attribute storage/access\0* Less boilerplate\0\0=================\0Benefits of Moose\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * but possible: `MooseX::GlobRef::Object`\0* Extending non-Hash based classes is tricky.\0ad\0\0\ e\0\0\0†\ 2\0\0\0\10\0\0™\0\0\0¥\ f\0\0¤\ f\0\0\ f\0\0v\ f\0\0u\ f\0\0i\ f\0\0Y\ f\0\0N\ f\0\0M\ f\0\03\ f\0\0\19\ f\0\0\18\ f\0\0\15\ f\0\0\a\ f\0\0\ 6\ f\0\0«\ e\0\0ª\ e\0\0‹\ e\0\0l\ e\0\0k\ e\0\0[\ e\0\0D\ e\0\0"\ e\0\0õ\r\0\0ô\r\0\0™\r\0\0˜\r\0\0y\r\0\0Z\r\0\0Y\r\0\0=\r\0\0#\r\0\0ø\f\0\0Î\f\0\0µ\f\0\0´\f\0\0\f\0\0Œ\f\0\0‹\f\0\0€\f\0\0\7f\f\0\0D\f\0\0C\f\0\0è\v\0\0ç\v\0\0É\v\0\0«\v\0\0ª\v\0\0ž\v\0\0\v\0\0‚\v\0\0\v\0\0s\v\0\0b\v\0\0P\v\0\0;\v\0\08\v\0\07\v\0\0(\v\0\0\13\v\0\0ø
34\0\0æ
35\0\0º
36\0\0·
37\0\0©
38\0\0ž
39\0\0
40\0\0‹
41\0\0Š
42\0\0/
43\0\0.
44\0\0\b
45\0\0â \0\0á \0\0Ð \0\0» \0\0‘ \0\0b \0\0a \0\0G \0\0\17 \0\0\0 \0\0ÿ\b\0\0ô\b\0\0â\b\0\0á\b\0\0»\b\0\0º\b\0\0_\b\0\0^\b\0\08\b\0\0\12\b\0\0\11\b\0\0ø\a\0\0Ó\a\0\04\a\0\0\14\a\0\0\b\a\0\0Ò\ 6\0\0Ä\ 6\0\0¹\ 6\0\0¸\ 6\0\0¢\ 6\0\0¡\ 6\0\0F\ 6\0\0E\ 6\0\06\ 6\0\0'\ 6\0\0&\ 6\0\0\r\ 6\0\0Û\ 5\0\0Ú\ 5\0\0Î\ 5\0\0¸\ 5\0\0œ\ 5\0\0y\ 5\0\0x\ 5\0\0_\ 5\0\0G\ 5\0\0"\ 5\0\0\14\ 5\0\0 \ 5\0\0\b\ 5\0\0ù\ 4\0\0ø\ 4\0\0\ 4\0\0œ\ 4\0\0…\ 4\0\0n\ 4\0\0m\ 4\0\0a\ 4\0\0O\ 4\0\0D\ 4\0\00\ 4\0\0+\ 4\0\0\19\ 4\0\0\b\ 4\0\0ò\ 3\0\0á\ 3\0\0Á\ 3\0\0 \ 3\0\0š\ 3\0\0—\ 3\0\0‰\ 3\0\0ˆ\ 3\0\0U\ 3\0\0"\ 3\0\0!\ 3\0\0Æ\ 2\0\0Å\ 2\0\0¦\ 2\0\0‡\ 2\0\0†\ 2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0==============================\0Conventional Delegates (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * `$emp->coworkers` == `$emp->manager->staff `\0* manager `handles` certain methods for `Employee`\0\0</code></pre>\0);\0 }\0 coworkers => 'staff',\0 manager_name => 'name',\0 handles => {\0 isa => 'Manager',\0 is => 'ro',\0has manager => (\0 \0extends qw(Person);\0use Moose;\0package Employee;\0<pre><code>\0\0======================\0Conventional Delegates\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0type hierarchy\0\0##########\0</code></pre>\0 => where { blessed($_) }\0 => as 'Ref'\0 subtype 'Object'\0\0 => where { ref($_) };\0 => as 'Defined'\0 subtype 'Ref'\0<pre><code>\0\0 * `Item` ⊃ `Defined` ⊃ `Ref` ⊃ `Object`\0* Types have a hierarchy\0\0==============\0Typical Family\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0isa, type constraints\0\0##########\0</code></pre>\0 has 'date' => (isa => 'DateTime'); # DWIM\0<pre><code>\0 * Types don't need to exist\0 * `Any, Item, Bool, Undef, Defined, Value, Num, Int, Str, Ref, ScalarRef, ArrayRef, HashRef, CodeRef, RegexpRef, GlobRef, FileHandle, Object and Role`\0 * `Moose::Util::TypeConstraints`\0* `isa` specifies a type\0\0=====================================\0Variations on a Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0non refs make accidental sharing hard\0\0discusses default\0##########\0\0 * not inside `new`\0 * called on first usage of `$object->staff`\0* `lazy` delays `default`\0\0 * used when no parameter is given to `new`\0 * or non-reference (numbers, strings)\0 * code reference\0* `default` is a\0\0=====================================\0Variations on a Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Adds default, isa\0\0##########\0</code></pre>\0);\0 default => sub { [qw(Bob Alice Tim)] },\0 lazy => 1,\0 isa => 'ArrayRef',\0 is => 'ro',\0has staff => (\0\0);\0 default => 'Bob'\0 isa => 'Str',\0 is => 'rw',\0has name => (\0\0use Moose;\0package Manager;\0<pre><code>\0\0=============================\0Variations on a Moose Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Now we're going to discuss more features of the attributes\0\0##########\0\0\0* `new` inherited from `Moose::Object`\0\0 * `writer`, `reader`\0 * `is => 'ro'` → read only accessor\0 * `is => 'rw'` → read/write accessor\0 * generates accessors\0* `has` declares attributes\0\0==============================\0A Simple Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * `@ISA = qw(Moose::Object) unless @ISA`\0 * `use strict; use warnings;`\0 * imports keywords\0* `use Moose;` \0\0==============================\0A Simple Moose Example (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\01;\0\0has age => (is => 'rw');\0has name => (is => 'rw');\0\0use Moose;\0package Person;\0<pre><code>\0\0======================\0A Simple Moose Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0ad\0\0\v\0\0\0¿\ 2\0\0\0\10\0\0¨\0\0\0ý\ f\0\0ï\ f\0\0î\ f\0\0ã\ f\0\0â\ f\0\0É\ f\0\0È\ f\0\0Œ\ f\0\0‹\ f\0\00\ f\0\0/\ f\0\0\17\ f\0\0ÿ\ e\0\0þ\ e\0\0ò\ e\0\0ß\ e\0\0Ï\ e\0\0®\ e\0\0«\ e\0\0ª\ e\0\0’\ e\0\0‚\ e\0\0W\ e\0\0T\ e\0\0F\ e\0\0E\ e\0\0:\ e\0\09\ e\0\0\ 2\ e\0\0\ 1\ e\0\0î\r\0\0í\r\0\0’\r\0\0r\r\0\0R\r\0\0Q\r\0\0E\r\0\03\r\0\0#\r\0\0ô\f\0\0ï\f\0\0î\f\0\0Þ\f\0\0Î\f\0\0˜\f\0\0•\f\0\0‡\f\0\0†\f\0\0{\f\0\0z\f\0\0n\f\0\0m\f\0\0\12\f\0\0\11\f\0\0ñ\v\0\0Ñ\v\0\0Ð\v\0\0Ä\v\0\0·\v\0\0¬\v\0\0Š\v\0\0‰\v\0\0g\v\0\0f\v\0\0D\v\0\0*\v\0\0'\v\0\0&\v\0\0\17\v\0\0\ 6\v\0\0è
46\0\0å
47\0\0×
48\0\0Ö
49\0\0Ë
50\0\0Ê
51\0\0®
52\0\0­
53\0\0ˆ
54\0\0‡
55\0\0,
56\0\0+
57\0\0\b
58\0\0å \0\0ä \0\0Ø \0\0\0\0µ \0\0† \0\0… \0\0d \0\0E \0\0\11 \0\0
59 \0\0\a \0\0\ 6 \0\0÷\b\0\0Ó\b\0\0Â\b\0\0¿\b\0\0±\b\0\0°\b\0\0¥\b\0\0¤\b\0\0j\b\0\0i\b\0\0\ e\b\0\0\r\b\0\0ú\a\0\0è\a\0\0ç\a\0\0Ñ\a\0\0\a\0\0¢\a\0\0y\a\0\0J\a\0\0I\a\0\0î\ 6\0\0í\ 6\0\0Ó\ 6\0\0¹\ 6\0\0¸\ 6\0\0£\ 6\0\0s\ 6\0\0B\ 6\0\0\ f\ 6\0\0Ä\ 5\0\0Œ\ 5\0\0‹\ 5\0\0€\ 5\0\0\7f\ 5\0\0U\ 5\0\0T\ 5\0\0\r\ 5\0\0\f\ 5\0\0±\ 4\0\0°\ 4\0\0–\ 4\0\0|\ 4\0\0{\ 4\0\0o\ 4\0\0_\ 4\0\0T\ 4\0\0S\ 4\0\0=\ 4\0\0<\ 4\0\0!\ 4\0\0 \ 4\0\0\1f\ 4\0\0\11\ 4\0\0\ 6\ 4\0\0\ 5\ 4\0\0ï\ 3\0\0î\ 3\0\0Ò\ 3\0\0Ñ\ 3\0\0Ã\ 3\0\0Â\ 3\0\0ž\ 3\0\0o\ 3\0\0n\ 3\0\0\13\ 3\0\0\12\ 3\0\0ø\ 2\0\0Þ\ 2\0\0Ý\ 2\0\0Ñ\ 2\0\0¿\ 2\0\0\0\0\0\0\0\0\0\0\0\0\0package Salaried;\0<pre><code>\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * `Salaried::Hourly` was added to `Minion`\0* `with` adds roles into your class\0\0</code></pre>\0\0with qw(Salaried::Monthly);\0\0extends qw(Employee);\0\0use Moose;\0package Boss;\0\0\0with qw(Salaried::Hourly);\0\0extends qw(Employee);\0\0use Moose;\0package Minion;\0<pre><code>\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Param is good for interacting with e.g. CGI::Expand or similar modules\0\0Some examples of small reusable behaviors\0\0##########\0\0 * `MooseX::Param` - `param` method like `CGI.pm`'s,\0 * `MooseX::LogDispatch` - `$self->logger->info("something happenned")`\0 * `MooseX::Getopt` - `@ARGV` aware constructor\0 * `MooseX::Storage` - Flexible serialization\0 * `MooseX::Clone` - Flexible `clone` method\0* Roles on the CPAN:\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * better than using a multiple inheritence\0* A role is for small reusable behaviors\0 * mixin: useful\0 * Java Interface: safe\0* A role is like a…\0\0=================\0Role of the Moose \0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0coerce parametrized ArrayRef[Employee] from ArrayRef[Str]\0\0##########\0\0</code></pre>\0);\0 coerce => 1,\0 isa => 'ArrayRef[Employee]',\0has staff => (\0\0);\0 },\0 [ map { Employee->new( name => $_ ) } @$_ ]\0 from 'ArrayRef[Str]' via {\0coerce 'ArrayRef[Employee]' => (\0\0subtype 'ArrayRef[Employee]' => as 'ArrayRef';\0\0use Moose::Util::TypeConstraints;\0<pre><code>\0\0==================================\0Some Parametrized Type of Coercion\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Can use any validation from the CPAN\0\0Test::Deep custom validator\0\0##########\0\0</code></pre>\0);\0 isa => 'SomethingTricky',\0 is => 'rw',\0has 'bar' => (\0\0};\0 eq_deeply( $_, ... );\0type 'SomethingTricky' => where {\0\0use Test::Deep qw(eq_deeply ...);\0\0use Moose::Util::TypeConstraints;\0use Moose;\0package Foo;\0<pre><code>\0\0===============================\0Some Type of Digression (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Union types\0\0##########\0\0</code></pre>\0);\0 isa => 'Employee | ArrayRef[ Employee | Group ]',\0 is => 'rw',\0has member => (\0\0); \0 isa => 'English | Welsh | Scots | Gaelic',\0 is => 'rw',\0has language => (\0<pre><code>\0\0===============================\0Some Type of Digression (cont.)\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Parametrized types\0\0Going to go into features of the type system for a bit\0\0##########\0\0</code></pre>\0);\0 isa => 'ArrayRef[ArrayRef[ShinyBead]]'\0 is => 'rw',\0has shopping_carts => (\0\0);\0 isa => 'ArrayRef[Employee]',\0 is => 'rw',\0has employees => (\0<pre><code>\0\0=======================\0Some Type of Digression\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0class types are automatically created for all Moose classes\0\0breakdown of the example\0\0##########\0\0</code></pre>\0);\0ad\0\0\ f\0\0\0ã\ 2\0\0\0\10\0\0°\0\0\0ï\ f\0\0î\ f\0\0Ò\ f\0\0Ä\ f\0\0Ã\ f\0\0¯\ f\0\0®\ f\0\0S\ f\0\0R\ f\0\08\ f\0\0\1e\ f\0\0\1d\ f\0\0\11\ f\0\0÷\ e\0\0æ\ e\0\0å\ e\0\0Ò\ e\0\0Ñ\ e\0\0¼\ e\0\0ª\ e\0\0™\ e\0\0†\ e\0\0ƒ\ e\0\0‚\ e\0\0l\ e\0\0Z\ e\0\0I\ e\0\07\ e\0\04\ e\0\03\ e\0\0\11\ e\0\0û\r\0\0å\r\0\0·\r\0\0µ\r\0\0´\r\0\0¦\r\0\0¥\r\0\0Œ\r\0\0‹\r\0\00\r\0\0/\r\0\0\15\r\0\0û\f\0\0ú\f\0\0Þ\f\0\0´\f\0\0•\f\0\0”\f\0\0‰\f\0\0c\f\0\08\f\0\07\f\0\0Ü\v\0\0Û\v\0\0Á\v\0\0§\v\0\0¦\v\0\0“\v\0\0}\v\0\0m\v\0\0]\v\0\0\\v\0\0\ 1\v\0\0\0\v\0\0æ
60\0\0Ì
61\0\0Ë
62\0\0¸
63\0\0£
64\0\0‰
65\0\0k
66\0\0j
67\0\0_
68\0\0Ò \0\0“ \0\0’ \0\0R \0\0Q \0\0" \0\0! \0\0Æ\b\0\0Å\b\0\0«\b\0\0‘\b\0\0\b\0\0„\b\0\0t\b\0\0c\b\0\0b\b\0\0V\b\0\0E\b\0\0C\b\0\0B\b\0\04\b\0\0$\b\0\0#\b\0\0\17\b\0\0\ 3\b\0\0\ 1\b\0\0\0\b\0\0ó\a\0\0è\a\0\0ç\a\0\0Ý\a\0\0Ô\a\0\0Ë\a\0\0À\a\0\0½\a\0\0¯\a\0\0®\a\0\0£\a\0\0¢\a\0\0˜\a\0\0—\a\0\0<\a\0\0;\a\0\0!\a\0\0\a\a\0\0\ 6\a\0\0ú\ 6\0\0æ\ 6\0\0Û\ 6\0\0Ú\ 6\0\0Ó\ 6\0\0Å\ 6\0\0²\ 6\0\0‘\ 6\0\0†\ 6\0\0\7f\ 6\0\0r\ 6\0\0_\ 6\0\0=\ 6\0\03\ 6\0\0,\ 6\0\0)\ 6\0\0(\ 6\0\0\1d\ 6\0\0\a\ 6\0\0\ 2\ 6\0\0ê\ 5\0\0Ð\ 5\0\0Ã\ 5\0\0¨\ 5\0\0¢\ 5\0\0 \ 5\0\0’\ 5\0\0‘\ 5\0\0s\ 5\0\0q\ 5\0\0f\ 5\0\0e\ 5\0\0N\ 5\0\03\ 5\0\0\1d\ 5\0\0\1c\ 5\0\0Á\ 4\0\0À\ 4\0\0ª\ 4\0\0”\ 4\0\0“\ 4\0\0r\ 4\0\0M\ 4\0\0&\ 4\0\0!\ 4\0\0\15\ 4\0\0ä\ 3\0\0²\ 3\0\0‚\ 3\0\0\ 3\0\0i\ 3\0\0[\ 3\0\0Z\ 3\0\0ÿ\ 2\0\0þ\ 2\0\0ã\ 2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0Looking in From the Inside\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0warn $obj->meta->name;\0\0my $emo = $obj->meta->meta; # even more meta!\0my $meta = MyApp->meta; # MyApp's metaclass\0my $class = $obj->meta; # $obj's metaclass\0<pre><code>\0 \0 * "makes an object for everything"\0 * Metaobject Protocol for Perl 5\0* Moose is based on `Class::MOP`\0\0=====================\0MOPs Mean Cleanliness\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0Finer grained control\0Easier conflict resolution\0Composition parameters\0\0##########\0 \0* Not that common in practice\0\0</code></pre>\0}\0 }\0 $self->bark_sound;\0 } else {\0 $self->tree_bark;\0 if ( $condition ) {\0 \0 my $self = shift;\0sub bark {\0\0);\0 },\0 }\0 bark => "bark_sound",\0 alias => {\0 Dog => {\0 },\0 },\0 bark => "tree_bark",\0 alias => {\0 Tree => {\0with (\0\0use Moose;\0package Ent::Puppy;\0<pre><code>\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0conflicts\0\0##########\0\0</code></pre>\0);\0 Ballet\0 Punk\0with qw(\0# KABOOM:\0\0use Moose;\0package Foo;\0\0}\0 MOSH!!!11one();\0sub dance {\0\0use Moose::Role\0package Punk;\0\0}\0 pirouette();\0sub dance {\0\0use Moose::Role;\0package Ballet;\0<pre><code>\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0roles also provide easy ways to fix the errors\0\0roles cause errors at compile time, unlike multiple inheritence\0\0multiple inheritence silently assumes you want the first class\0symmetric composition means no precedence - if two roles try to define the same thing you get a compile time error that needs to be resolved\0##########\0\0 * …And ways to fix them\0 * Compile time errors\0 * Less ambiguity\0* Role Composition\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Unordered\0 * Symmetric\0 * Not inheritence\0* Role Composition\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0roles provide behavior, not just interface\0roles can have attributes and methods\0##########\0\0 * Roles can also have code\0 * Interfaces are behavior "contracts"\0* More than Java Interfaces\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* More than an interface\0\0</code></pre>\0\0}\0 $self->logged_hours * $self->hourly_rate;\0 my $self = shift;\0sub paycheck_amount {\0# satisfy the Salaried interface:\0\0);\0 default => 0,\0 is => "rw",\0 isa => "Num",\0has logged_hours => (\0\0);\0 required => 1,\0 is => "rw",\0 isa => "Num",\0has hourly_rate => (\0\0with qw(Salaried);\0\0use Moose::Role;\0package Salaried::Hourly;\0<pre><code>\0\0=========================\0Role of the Moose (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Just an interface\0\0</code></pre>\0requires 'paycheck_amount';\0\0use Moose::Role;\0ad\0\0(\0\0\0t\ 2\0\0\0\10\0\0Ž\0\0\0ä\ f\0\0ã\ f\0\0×\ f\0\0¹\ f\0\0¸\ f\0\0ž\ f\0\0\ f\0\0\ f\0\0€\ f\0\0a\ f\0\0`\ f\0\01\ f\0\00\ f\0\0 \ f\0\0\12\ f\0\0\a\ f\0\0\ 6\ f\0\0ñ\ e\0\0ð\ e\0\0•\ e\0\0”\ e\0\0q\ e\0\0N\ e\0\0M\ e\0\0A\ e\0\0\1e\ e\0\0\0\ e\0\0ß\r\0\0É\r\0\0”\r\0\0_\r\0\0V\r\0\0C\r\0\0\e\r\0\0ô\f\0\0ì\f\0\0é\f\0\0è\f\0\0ª\f\0\0œ\f\0\0›\f\0\0\f\0\0\f\0\0g\f\0\0\f\f\0\0\v\f\0\0è\v\0\0Å\v\0\0Ä\v\0\0¸\v\0\0\v\0\0œ\v\0\0z\v\0\0m\v\0\0]\v\0\0Z\v\0\0L\v\0\0K\v\0\05\v\0\0\14\v\0\0\13\v\0\0¸
69\0\0·
70\0\0£
71\0\0
72\0\0Ž
73\0\0h
74\0\0g
75\0\0[
76\0\0H
77\0\0"
78\0\0\1a
79\0\0\17
80\0\0
81\0\0\b
82\0\0é \0\0È \0\0® \0\0ï\b\0\0î\b\0\0“\b\0\0’\b\0\0x\b\0\0^\b\0\0]\b\0\0J\b\0\00\b\0\0\1c\b\0\0\e\b\0\0À\a\0\0¿\a\0\0\a\0\0{\a\0\0z\a\0\0f\a\0\0X\a\0\0F\a\0\0E\a\0\0ê\ 6\0\0é\ 6\0\0Ç\ 6\0\0¥\ 6\0\0¤\ 6\0\0q\ 6\0\0O\ 6\0\0+\ 6\0\0\12\ 6\0\0ú\ 5\0\0â\ 5\0\0á\ 5\0\0†\ 5\0\0…\ 5\0\0c\ 5\0\0A\ 5\0\0@\ 5\0\0"\ 5\0\0\ 5\ 5\0\0â\ 4\0\0Ì\ 4\0\0³\ 4\0\0²\ 4\0\0W\ 4\0\0V\ 4\0\04\ 4\0\0\12\ 4\0\0\11\ 4\0\0ï\ 3\0\0Ô\ 3\0\0³\ 3\0\0Ÿ\ 3\0\0…\ 3\0\0m\ 3\0\0l\ 3\0\0\11\ 3\0\0\10\ 3\0\0ý\ 2\0\0ê\ 2\0\0é\ 2\0\0Ý\ 2\0\0µ\ 2\0\0œ\ 2\0\0t\ 2\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 * but you only pay for what you use\0* Some features are slow\0 * `MooseX::Compile` is in the works\0* Load time\0\0==================\0Drawbacks of Moose\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Clean, extensible\0 * Editing widgets\0 * HTML view\0 * Object introspection based\0 * Generic web frontend\0* Step 2.3 Introspection goodness\0\0=================================\0Working in the Meta Frame (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * access control\0 * field types\0 * Embed additional information\0 * Extend the metaclasses\0* Step 2.2. Meta descriptions\0\0=================================\0Working in the Meta Frame (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Moose → SAX\0 * SAX → Moose\0 * XML storage backed\0 * High level objects in runtime\0 * Automatic class definitions\0* Step 2.1. Client's XML schemas → Moose classes\0\0=================================\0Working in the Meta Frame (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Step 3. Profit!\0* Step 2. ???\0* Step 1. use Moose\0\0=================================\0Working in the Meta Frame (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Content is in XML\0* CMS for a flash website\0* `$work` project:\0\0=========================\0Working in the Meta Frame\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * `Moose::Meta::Class`, `Moose::Meta::Attribute, ``Moose::Meta::Method`, `Moose::Meta::Method::Accessor` `Moose::Meta::Instance`, `Moose::Meta::Role`, `Moose::Meta::TypeConstraint`, …,\0* Many customizable parts\0 * change how attributes work\0* custom attribute metaclasses\0\0</code></pre>\0);\0 ...\0 metaclass => 'Collection::Array',\0has employees => (\0<pre><code>\0\0* Metaclassses control class behavior\0\0===================\0The Metaclass Tango\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * The MOP does the hard work\0* Moose is just sugar\0\0</code></pre>\0);\0 is => "rw",\0 "foo", \0__PACKAGE__->meta->add_attribute(\0\0has foo => ( is => "rw" );\0<pre><code>\0\0==================================\0Looking in From the Inside (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0Classes can be created programmatically\0\0##########\0\0</code></pre>\0my $anon_meta = Moose::Meta::Class->create_anon_class( ... );\0\0);\0 }\0 construct_baz => sub { ... }\0 calculate_bar => sub { ... },\0 methods => {\0 ],\0 Moose::Meta::Attribute->new( baz => ... ),\0 Moose::Meta::Attribute->new( bar => ... ),\0 attributes => [\0 superclasses => [ 'Foo' ],\0 version => '0.01',\0Moose::Meta::Class->create( Bar =>\0<pre><code>\0\0==================================\0Looking in From the Inside (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0simple introspection\0\0##########\0</code></pre>\0# … lots more\0\0$metaclass->compute_all_applicable_attributes;\0\0$metaclass->has_method("foo");\0\0$metaclass->linearized_isa;\0\0$metaclass->superclasses;\0\0my $metaclass = $self->meta; \0<pre><code>\0\0===========================\0ad\0\0– \0\0Ú
83\0\0\0\10\0\0L\0\0\0ì\ f\0\0Í\ f\0\0²\ f\0\0Ÿ\ f\0\0‹\ f\0\0Š\ f\0\0}\ f\0\0p\ f\0\0o\ f\0\0`\ f\0\0X\ f\0\08\ f\0\0&\ f\0\0\13\ f\0\0\0\ f\0\0ÿ\ e\0\0¤\ e\0\0£\ e\0\0š\ e\0\0‘\ e\0\0\ e\0\0b\ e\0\0a\ e\0\0\ 6\ e\0\0\ 5\ e\0\0ü\r\0\0ó\r\0\0ò\r\0\0Ï\r\0\0¿\r\0\0˜\r\0\0ˆ\r\0\0r\r\0\0e\r\0\0[\r\0\0?\r\0\0)\r\0\0(\r\0\0Í\f\0\0Ì\f\0\0»\f\0\0ª\f\0\0©\f\0\0\f\0\0\f\0\0Œ\f\0\0€\f\0\0r\f\0\0q\f\0\0g\f\0\0H\f\0\0G\f\0\0 \f\0\0\1f\f\0\0\f\f\0\0ø\v\0\0á\v\0\0Ò\v\0\0Ã\v\0\0Á\v\0\0À\v\0\0µ\v\0\0™\v\0\0r\v\0\0X\v\0\0V\v\0\0U\v\0\0K\v\0\0/\v\0\0 \v\0\0ï
84\0\0í
85\0\0ì
86\0\0é
87\0\0Û
88\0\0Ú
89\0\0Ç
90\0\0²
91\0\0±
92\0\0ž
93\0\0Š
94\0\0v
95\0\0a
96\0\0`
97\0\0\
98\0\0X
99\0\0W
100\0\0ü \0\0û \0\0Ú \0\0¸ \0\0 \0\0œ \0\0Ž \0\0z \0\0^ \0\0] \0\0Z \0\0T \0\01 \0\0\16 \0\0\15 \0\0ù\b\0\0ø\b\0\0Ï\b\0\0Î\b\0\0¹\b\0\0 \b\0\0Ÿ\b\0\0\b\0\0~\b\0\0}\b\0\0h\b\0\0\\b\0\0[\b\0\0X\b\0\0.\b\0\0\1d\b\0\0\v\b\0\0ï\a\0\0à\a\0\0ß\a\0\0Á\a\0\0°\a\0\0Ÿ\a\0\0“\a\0\0’\a\0\0†\a\0\0z\a\0\0y\a\0\0\1e\a\0\0\1d\a\0\0\ e\a\0\0æ\ 6\0\0å\ 6\0\0×\ 6\0\0œ\ 6\0\0\ 6\0\0\ 6\0\0m\ 6\0\0l\ 6\0\0`\ 6\0\0T\ 6\0\0S\ 6\0\0ø\ 5\0\0÷\ 5\0\0é\ 5\0\0±\ 5\0\0z\ 5\0\0B\ 5\0\0
101\ 5\0\0Ö\ 4\0\0Õ\ 4\0\0©\ 4\0\0—\ 4\0\0‹\ 4\0\0Š\ 4\0\0z\ 4\0\0j\ 4\0\0i\ 4\0\0\ e\ 4\0\0\r\ 4\0\0ÿ\ 3\0\0ü\ 3\0\0Þ\ 3\0\0·\ 3\0\0\ 3\0\0Œ\ 3\0\0b\ 3\0\08\ 3\0\0\ e\ 3\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0</code></pre>\01;\0\0}\0 return $self->{ag\0</code></pre>\01;\0\0}\0 return $self->{ag\0</code></pre>\01;\0\0}\0 return $self->{ag\0</code></pre>\01;\0\0}\0 return $self->{ag\0\0</code></pre>\01;\0\0}\0 return $self->\0</code></pre>\01;\0\0}\0 retur\0</\0</code></pre>\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{age} = $args[0] if @args;\0 my\0\0</code></pre>\01\0</code></pre>\01\0\0</code></pr\0</code></pre>\01;\0\0</code></pre>\01;\0\0}\0 return $self->{age}\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $sel\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self\0</code></pre>\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{age} = $args[0] if @args;\0 my\0\0</code></pr\0</code></pr\0\0</code></pre>\01;\0\0}\0 return $s\0\0</code></pr\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{\0</code></pre>\0\0</code></pre>\01;\0\0}\0 return $self->{\0</code></pre>\0\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{age} = $args[0] if @args;\0 my\0\0</code></pr\0</code></pr\0\0</code></pr\0</code></pre>\01;\0</code></pre>\01;\0</code></pre>\01;\0\0}\0 retur\0\0</code></pre>\0\0</code></pre>\01;\0\0}\0 ret\0</code></pre>\01;\0\0</code></pre>\01;\0</code></pre>\01;\0\0}\0 return $self->{ag\0</\0\0</code></pr\0</code></pre>\01;\0\0}\0\0\0</code></pre>\01;\0\0}\0 return\0<\0\0</code></pre>\01;\0\0}\0 \0</code></pre>\01;\0\0}\0\0\0</code></pre>\01;\0\0}\0 return $self->{a\0\0</code></pre>\01;\0\0}\0 ret\0\0</code></pre>\01;\0\0}\0 re\0</code></pre>\01;\0\0}\0 return $se\0</cod\0</\0\0</code></pre>\01;\0\0}\0 ret\0</code></pre>\01;\0\0}\0</code></pre>\0\0</code></pre>\01;\0\0}\0 re\0</code></pre>\01;\0\0}\0 return $s\0</code></pre>\01;\0\0}\0 return $\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{age} = $args[0] if @args;\0 my\0\0</c\0</c\0\0</code></pre>\01;\0\0}\0\0</code></pre>\01;\0\0}\0</code></pre>\01;\0\0}\0</code></pre>\01;\0\0\0\0</code></pre>\01;\0\0}\0\0</code></pre>\01;\0\0\0</code></pre>\01;\0\0}\0 return $self->{age}; \0 $self->{age} = $args[0] if @args;\0 my ($self, @args) = @_;\0sub age {\0\0}\0 return $self->{name};\0 $self->{name} = $args[0] if @args;\0 my ($self, @args) = @_;\0sub name {\0\0}\0 }, $class;\0 @args,\0 age => undef,\0 name => '',\0 return bless {\0\0 @args = %{$args[0]} if @args == 1;\0\0 my ( $class, @args ) = @_;\0sub new {\0\0use warnings;\0use strict;\0\0package Person;\0<pre><code>\0\0================\0A Simple Example\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Polite, incremental\0* Stable & Production ready\0 * …\0 * Perl 6\0 * Alces latifrons\0 * Smalltalk\0 * CLOS (Common Lisp Object System)\0* Rich ancestry\0* Syntactic Sugar for `Class::MOP`\0\0========\0Moose Is\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* A complete modern object framework for Perl\0\0========\0Moose Is\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* Perl 6 in Perl 5\0* Perl black magic\0* A source filter\0* Just another accessor builder\0* A toy\0* Experimental\0\0============\0Moose Is Not\0\0Theme: moose\0Date: 2008\0Presenter: Yuval Kogman\0Location: YAPC::Asia::2008\0Title: Moose\0ad\0\0\ 3\0\0\0Ç\ 2\0\0\0\10\0\0¬\0\0\0ô\ f\0\0å\ f\0\0Ý\ f\0\0\ f\0\0³\ f\0\0¥\ f\0\0¤\ f\0\0I\ f\0\0H\ f\0\0)\ f\0\0
102\ f\0\0 \ f\0\0ý\ e\0\0î\ e\0\0æ\ e\0\0Î\ e\0\0¯\ e\0\0¬\ e\0\0ž\ e\0\0\ e\0\0B\ e\0\0A\ e\0\0"\ e\0\0\ 3\ e\0\0\ 2\ e\0\0ö\r\0\0ç\r\0\0ß\r\0\0¼\r\0\0¹\r\0\0«\r\0\0ª\r\0\0O\r\0\0N\r\0\05\r\0\0\1c\r\0\0\e\r\0\0\ f\r\0\0þ\f\0\0ó\f\0\0Õ\f\0\0Ñ\f\0\0¾\f\0\0˜\f\0\0v\f\0\0e\f\0\0S\f\0\02\f\0\0\ e\f\0\0æ\v\0\0Ä\v\0\0½\v\0\0º\v\0\0¬\v\0\0Q\v\0\0P\v\0\0?\v\0\0.\v\0\0-\v\0\0!\v\0\0é
103\0\0è
104\0\0¨
105\0\0š
106\0\0™
107\0\0‡
108\0\0n
109\0\0P
110\0\0O
111\0\0ô \0\0ó \0\0Ú \0\0Á \0\0À \0\0´ \0\0— \0\0t \0\0l \0\0F \0\0> \0\0* \0\0' \0\0\19 \0\0\18 \0\0½\b\0\0¼\b\0\0£\b\0\0Š\b\0\0‰\b\0\0}\b\0\0k\b\0\0`\b\0\0_\b\0\0Q\b\0\0;\b\0\06\b\0\0!\b\0\0\1c\b\0\0ú\a\0\0õ\a\0\0ß\a\0\0Ý\a\0\0Ï\a\0\0Î\a\0\0s\a\0\0r\a\0\0Y\a\0\0@\a\0\0?\a\0\03\a\0\0\e\a\0\0\10\a\0\0\ f\a\0\0ù\ 6\0\0ø\ 6\0\0ß\ 6\0\0É\ 6\0\0Ä\ 6\0\0«\ 6\0\0\7f\ 6\0\0y\ 6\0\0v\ 6\0\0u\ 6\0\0A\ 6\0\03\ 6\0\0Ø\ 5\0\0×\ 5\0\0Á\ 5\0\0«\ 5\0\0ª\ 5\0\0ž\ 5\0\0Œ\ 5\0\0\ 5\0\0_\ 5\0\0K\ 5\0\0J\ 5\0\04\ 5\0\03\ 5\0\0\1d\ 5\0\0ç\ 4\0\0ä\ 4\0\0ã\ 4\0\0Ò\ 4\0\0Â\ 4\0\0¬\ 4\0\0˜\ 4\0\0‡\ 4\0\0„\ 4\0\0v\ 4\0\0u\ 4\0\0\1a\ 4\0\0\19\ 4\0\0û\ 3\0\0Ý\ 3\0\0Ü\ 3\0\0Ð\ 3\0\0®\ 3\0\0Œ\ 3\0\0‹\ 3\0\0Š\ 3\0\0d\ 3\0\0N\ 3\0\0M\ 3\0\0L\ 3\0\04\ 3\0\0\r\ 3\0\0\f\ 3\0\0\v\ 3\0\0ñ\ 2\0\0à\ 2\0\0Ø\ 2\0\0Ç\ 2\0\0\0\0\0 coerce => 1,\0 ...\0has manager => (\0# enable it per attribute\0\0\0... via { Manager->new( name => $_ ) }\0# define the conversion\0\0\0class_type "Manager";\0# define Manager, a subtype of Object\0\0\0use Moose::Util::TypeConstraints;\0# import type constraint keywords\0<pre><code>\0\0=============================\0Some Type of Coercion (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0);\0 coerce => 1,\0 required => 1, \0 isa => 'Manager',\0 is => 'ro',\0has manager => (\0\0);\0 from 'Str' => via { Manager->new( name => $_ ) },\0coerce 'Manager' => (\0\0class_type 'Manager';\0\0extends qw(Person);\0use Moose::Util::TypeConstraints;\0use Moose;\0package Employee;\0<pre><code>\0\0=====================\0Some Type of Coercion\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0</code></pre>\0$chef->do_work; # punch in, flip burgers, punch out\0\0};\0 }\0 $self->flip_burger(shift @burgers);\0 while ( @burgers ) {\0 \0 my $self = shift;\0augment do_work => sub {\0\0extends qw(Employee);\0\0use Moose;\0package Employee::Chef;\0<pre><code>\0\0========================\0Modified Methods (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0}\0 $self->punch_out;\0 \0 inner(); # call subclass here\0 \0 $self->punch_in;\0 \0 my $self = shift;\0sub do_work {\0\0use Moose;\0package Employee;\0<pre><code>\0\0========================\0Modified Methods (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0};\0 return @return;\0 ...\0 my @return = $self->$next(@args);\0 ...\0 my ($next, $self, @args) = @_;\0around 'employees' => sub { \0<pre><code>\0\0========================\0Modified Methods (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0 * Return value is ignored\0 * Get a copy of `@_`\0* Pre/Post hooks\0\0</code></pre>\0after 'employees' => sub { warn 'finished calling employees' };\0\0before 'employees' => sub { warn 'calling employees' };\0<pre><code>\0\0================\0Modified Methods\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0</code></pre>\0);\0 },\0 empty => 'any_employees',\0 count => 'number_of_employees',\0 pop => 'remove_employee',\0 push => 'add_employee',\0 provides => {\0 is => 'rw',\0 isa => 'ArrayRef[Employees]',\0 metaclass => 'Collection::Array',\0has employees => (\0 \0use MooseX::AttributeHelpers;\0use Moose;\0package Company;\0<pre><code>\0\0========================\0UnConventional Delegates\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0);\0 handles => "Dialing", # a role\0 ...\0has phone => (\0<pre><code>\0\0==============================\0Conventional Delegates (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0);\0 handles => qr/^[a-z]\w+$/,\0 isa => "Phone",\0 ...\0has phone => (\0<pre><code>\0\0==============================\0Conventional Delegates (cont.)\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0</code></pre>\0);\0 handles => [qw(number extension)],\0 ...\0has phone => (\0<pre><code>\0ad\0\0/\r\0\0Ã\r\0\0\0\10\0\0 \0\0\0ç\ f\0\0Ò\ f\0\0Ñ\ f\0\0¨\ f\0\0§\ f\0\0‹\ f\0\0Š\ f\0\0l\ f\0\0I\ f\0\0C\ f\0\0@\ f\0\0?\ f\0\0#\ f\0\0\ f\ f\0\0\ 1\ f\0\0\0\ f\0\0å\ e\0\0Ã\ e\0\0¢\ e\0\0¡\ e\0\0F\ e\0\0E\ e\0\0A\ e\0\0=\ e\0\0<\ e\0\0'\ e\0\0\13\ e\0\0ÿ\r\0\0ì\r\0\0ë\r\0\0Ö\r\0\0Ã\r\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 * Yuval Kogman\0* Slides deleted by:\0\0 * Robert Boone\0 * Stevan Little\0 * Chris Prather\0* Slides written by:\0\0===\0Fin\0\0✂------✂------✂------✂------✂------✂------✂------✂------✂------✂------\0\0* `event` declares object states\0* Every object has a POE::Session\0* POE components made easy\0\0</code></pre>\0POE::Kernel->run();\0Counter->new( count => 0 );\0\0};\0 }\0 $self->yield('increment');\0 if ( $self->count < 3 ) {\0\0 $self->increment_count;\0\0 warn "Count is now " . $self->count;\0\0 my ($self) = @_;\0event increment => sub {\0