summaryrefslogtreecommitdiffstats
path: root/static/talks/extending_moose_yapc_na_2010
diff options
context:
space:
mode:
Diffstat (limited to 'static/talks/extending_moose_yapc_na_2010')
-rw-r--r--static/talks/extending_moose_yapc_na_2010/001.html45
-rw-r--r--static/talks/extending_moose_yapc_na_2010/002.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/003.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/003b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/003z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/004.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/005.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/006.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/007.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/007z.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/008.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/008b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/008c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/008d.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/008z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/009.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/010.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/010b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/010c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/010z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/011.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/011b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/011z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/012.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/013.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/014.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/015.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/016.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/017.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/017z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/018.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/019.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/019b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/019c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/019z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/020.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/021.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/022.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/022b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/022c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/022z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/023.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/023b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/023c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/023z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/024.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/024b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/024c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/024z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/025.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/026.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/026b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/026z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/027.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/027b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/027z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/028.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/028z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/029.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/030.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/030b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/030c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/030z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/031.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/032.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/033.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/033b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/033z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/034.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/035.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/035z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/036.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/036z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/037.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/038.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/038z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/039.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/040.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/041.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/041z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/042.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/042b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/042z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/043.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/043b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/043z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/044.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/045.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/046.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/047.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/048.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/049.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/050.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/050z.pl.html57
-rw-r--r--static/talks/extending_moose_yapc_na_2010/051.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/052.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/053.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/054.pl.html52
-rw-r--r--static/talks/extending_moose_yapc_na_2010/055.pl.html58
-rw-r--r--static/talks/extending_moose_yapc_na_2010/056.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/057.pl.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/058.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/059.pl.html59
-rw-r--r--static/talks/extending_moose_yapc_na_2010/060.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/061.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/061b.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/061c.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/061d.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/061z.html46
-rw-r--r--static/talks/extending_moose_yapc_na_2010/062.html42
-rw-r--r--static/talks/extending_moose_yapc_na_2010/index.html97
-rw-r--r--static/talks/extending_moose_yapc_na_2010/slides.vroom399
112 files changed, 5593 insertions, 0 deletions
diff --git a/static/talks/extending_moose_yapc_na_2010/001.html b/static/talks/extending_moose_yapc_na_2010/001.html
new file mode 100644
index 0000000..c31f6fb
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/001.html
@@ -0,0 +1,45 @@
+<html>
+<head>
+<title>001</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "002" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ Extending Moose
+
+ by Jesse Luehrs (doy at tozt dot net)
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/002.html b/static/talks/extending_moose_yapc_na_2010/002.html
new file mode 100644
index 0000000..f19d2f4
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/002.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>002</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "001" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "003" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ motivation
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/003.html b/static/talks/extending_moose_yapc_na_2010/003.html
new file mode 100644
index 0000000..190d180
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/003.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>003</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "002" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "003b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/003b.html b/static/talks/extending_moose_yapc_na_2010/003b.html
new file mode 100644
index 0000000..a9b584a
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/003b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>003b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "003" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "003z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose
+
+ great class builder
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/003z.html b/static/talks/extending_moose_yapc_na_2010/003z.html
new file mode 100644
index 0000000..af6fdcf
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/003z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>003z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "003b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "004" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose
+
+ great class builder
+
+ lots of beginner info available
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/004.html b/static/talks/extending_moose_yapc_na_2010/004.html
new file mode 100644
index 0000000..2bd886a
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/004.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>004</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "003z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "005.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ using only the basic features doesn't gain you much
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/005.pl.html b/static/talks/extending_moose_yapc_na_2010/005.pl.html
new file mode 100644
index 0000000..7a80895
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/005.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>005.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "004" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "006.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ package Foo;
+ use base qw(Class::Accessor);
+ __PACKAGE__-&gt;mk_accessors('bar');
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/006.pl.html b/static/talks/extending_moose_yapc_na_2010/006.pl.html
new file mode 100644
index 0000000..4827510
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/006.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>006.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "005.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "007.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ package Foo;
+ use Moose;
+ has bar =&gt; (is =&gt; 'ro');
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/007.pl.html b/static/talks/extending_moose_yapc_na_2010/007.pl.html
new file mode 100644
index 0000000..4867c18
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/007.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>007.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "006.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "007z.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ but...
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/007z.pl.html b/static/talks/extending_moose_yapc_na_2010/007z.pl.html
new file mode 100644
index 0000000..4f05317
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/007z.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>007z.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "007.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "008" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ but...
+
+ package Foo;
+ use Class::Accessor 'antlers';
+ has bar =&gt; (is =&gt; 'ro');
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/008.html b/static/talks/extending_moose_yapc_na_2010/008.html
new file mode 100644
index 0000000..3d6357b
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/008.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>008</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "007z.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "008b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose gives you more than this
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/008b.html b/static/talks/extending_moose_yapc_na_2010/008b.html
new file mode 100644
index 0000000..2770f7d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/008b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>008b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "008" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "008c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose gives you more than this
+
+ * builders
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/008c.html b/static/talks/extending_moose_yapc_na_2010/008c.html
new file mode 100644
index 0000000..b4b5ae0
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/008c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>008c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "008b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "008d" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose gives you more than this
+
+ * builders
+ * delegation
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/008d.html b/static/talks/extending_moose_yapc_na_2010/008d.html
new file mode 100644
index 0000000..68d9c4d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/008d.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>008d</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "008c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "008z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose gives you more than this
+
+ * builders
+ * delegation
+ * roles
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/008z.html b/static/talks/extending_moose_yapc_na_2010/008z.html
new file mode 100644
index 0000000..3e990be
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/008z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>008z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "008d" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "009" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ moose gives you more than this
+
+ * builders
+ * delegation
+ * roles
+ * etc...
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/009.html b/static/talks/extending_moose_yapc_na_2010/009.html
new file mode 100644
index 0000000..465baf3
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/009.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>009</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "008z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "010" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ but the real power of moose is in extensibility
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/010.html b/static/talks/extending_moose_yapc_na_2010/010.html
new file mode 100644
index 0000000..7efb1f3
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/010.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>010</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "009" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "010b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+ typical object systems are defined in terms of, well, object systems
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/010b.html b/static/talks/extending_moose_yapc_na_2010/010b.html
new file mode 100644
index 0000000..e997ca4
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/010b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>010b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "010" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "010c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+ typical object systems are defined in terms of, well, object systems
+
+ has input_file =&gt; (
+ is =&gt; 'ro',
+ isa =&gt; File,
+ coerce =&gt; 1,
+ required =&gt; 1,
+ );
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/010c.html b/static/talks/extending_moose_yapc_na_2010/010c.html
new file mode 100644
index 0000000..c91a322
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/010c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>010c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "010b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "010z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+ typical object systems are defined in terms of, well, object systems
+
+ has input_file =&gt; (
+ is =&gt; 'ro',
+ isa =&gt; File,
+ coerce =&gt; 1,
+ required =&gt; 1,
+ );
+
+ wouldn't it be nice to be able to say what we mean?
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/010z.html b/static/talks/extending_moose_yapc_na_2010/010z.html
new file mode 100644
index 0000000..b2c5610
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/010z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>010z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "010c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "011" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+ typical object systems are defined in terms of, well, object systems
+
+ has input_file =&gt; (
+ is =&gt; 'ro',
+ isa =&gt; File,
+ coerce =&gt; 1,
+ required =&gt; 1,
+ );
+
+ wouldn't it be nice to be able to say what we mean?
+
+ has_file 'input_file';
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/011.html b/static/talks/extending_moose_yapc_na_2010/011.html
new file mode 100644
index 0000000..1b0effd
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/011.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>011</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "010z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "011b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ code should be written with the intent of communicating with *humans*
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/011b.html b/static/talks/extending_moose_yapc_na_2010/011b.html
new file mode 100644
index 0000000..4d7ab4e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/011b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>011b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "011" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "011z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ code should be written with the intent of communicating with *humans*
+
+ computers are great at figuring out the details on their own
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/011z.html b/static/talks/extending_moose_yapc_na_2010/011z.html
new file mode 100644
index 0000000..f7a00ff
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/011z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>011z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "011b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "012" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ code should be written with the intent of communicating with *humans*
+
+ computers are great at figuring out the details on their own
+
+ write code in the language of the domain rather than the language of the computer
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/012.html b/static/talks/extending_moose_yapc_na_2010/012.html
new file mode 100644
index 0000000..654ab11
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/012.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>012</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "011z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "013" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ this has different levels:
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/013.html b/static/talks/extending_moose_yapc_na_2010/013.html
new file mode 100644
index 0000000..4d28940
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/013.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>013</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "012" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "014" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ perl:
+
+ a user is a hash table with a key storing the username and a key storing the password, associated with a set of functions for manipulating those hash keys while validating them and ensuring they remain consistent
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/014.html b/static/talks/extending_moose_yapc_na_2010/014.html
new file mode 100644
index 0000000..663661d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/014.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>014</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "013" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "015" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ moose (by default):
+
+ a user has a readonly string attribute storing the username, and a read/write Authen::Passphrase object storing the password, which password checking is delegated to
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/015.html b/static/talks/extending_moose_yapc_na_2010/015.html
new file mode 100644
index 0000000..4e43d87
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/015.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>015</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "014" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "016" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ but what we'd really like is:
+
+ a user has a name, and you can ask if its password is correct
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/016.html b/static/talks/extending_moose_yapc_na_2010/016.html
new file mode 100644
index 0000000..c43d2b9
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/016.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>016</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "015" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "017" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ moose can give us this too
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/017.html b/static/talks/extending_moose_yapc_na_2010/017.html
new file mode 100644
index 0000000..f99d50c
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/017.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>017</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "016" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "017z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ the mop
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/017z.html b/static/talks/extending_moose_yapc_na_2010/017z.html
new file mode 100644
index 0000000..3a57d5c
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/017z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>017z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "017" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "018" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ the mop
+
+ (meta object protocol)
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/018.html b/static/talks/extending_moose_yapc_na_2010/018.html
new file mode 100644
index 0000000..90604ea
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/018.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>018</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "017z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "019" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ models classes as objects
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/019.html b/static/talks/extending_moose_yapc_na_2010/019.html
new file mode 100644
index 0000000..a554692
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/019.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>019</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "018" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "019b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ every class is represented by a metaclass
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/019b.html b/static/talks/extending_moose_yapc_na_2010/019b.html
new file mode 100644
index 0000000..f988661
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/019b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>019b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "019" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "019c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ every class is represented by a metaclass
+
+ a normal perl object of the class Moose::Meta::Class
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/019c.html b/static/talks/extending_moose_yapc_na_2010/019c.html
new file mode 100644
index 0000000..d1a9e60
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/019c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>019c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "019b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "019z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ every class is represented by a metaclass
+
+ a normal perl object of the class Moose::Meta::Class
+
+ contains attributes and methods as members (objects of Moose::Meta::Attribute and Moose::Meta::Method)
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/019z.html b/static/talks/extending_moose_yapc_na_2010/019z.html
new file mode 100644
index 0000000..e894c8f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/019z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>019z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "019c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "020" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ every class is represented by a metaclass
+
+ a normal perl object of the class Moose::Meta::Class
+
+ contains attributes and methods as members (objects of Moose::Meta::Attribute and Moose::Meta::Method)
+
+ (other stuff too, but we'll ignore that for now)
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/020.html b/static/talks/extending_moose_yapc_na_2010/020.html
new file mode 100644
index 0000000..62ad473
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/020.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>020</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "019z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "021" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ Moose::Meta::Class
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/021.html b/static/talks/extending_moose_yapc_na_2010/021.html
new file mode 100644
index 0000000..32f72bc
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/021.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>021</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "020" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "022" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ access these objects through Class-&gt;meta (a class method installed by &quot;use Moose&quot;)
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/022.html b/static/talks/extending_moose_yapc_na_2010/022.html
new file mode 100644
index 0000000..457936d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/022.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>022</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "021" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "022b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ class information is stored and manipulated through these objects
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/022b.html b/static/talks/extending_moose_yapc_na_2010/022b.html
new file mode 100644
index 0000000..45d26f7
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/022b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>022b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "022" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "022c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ class information is stored and manipulated through these objects
+
+ * &quot;@ISA = ('Foo')&quot; -&gt; &quot;$meta-&gt;superclasses('Foo')&quot;
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/022c.html b/static/talks/extending_moose_yapc_na_2010/022c.html
new file mode 100644
index 0000000..10aa7d5
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/022c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>022c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "022b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "022z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ class information is stored and manipulated through these objects
+
+ * &quot;@ISA = ('Foo')&quot; -&gt; &quot;$meta-&gt;superclasses('Foo')&quot;
+ * &quot;*foo = sub { ... }&quot; -&gt; &quot;$meta-&gt;add_method(foo =&gt; sub { ... })&quot;
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/022z.html b/static/talks/extending_moose_yapc_na_2010/022z.html
new file mode 100644
index 0000000..66ad3f2
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/022z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>022z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "022c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "023" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ class information is stored and manipulated through these objects
+
+ * &quot;@ISA = ('Foo')&quot; -&gt; &quot;$meta-&gt;superclasses('Foo')&quot;
+ * &quot;*foo = sub { ... }&quot; -&gt; &quot;$meta-&gt;add_method(foo =&gt; sub { ... })&quot;
+ * &quot;our $foo = 'bar'&quot; -&gt; &quot;$meta-&gt;add_package_symbol('$foo' =&gt; 'bar')&quot;
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/023.html b/static/talks/extending_moose_yapc_na_2010/023.html
new file mode 100644
index 0000000..40a7d40
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/023.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>023</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "022z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "023b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ also provides informational methods
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/023b.html b/static/talks/extending_moose_yapc_na_2010/023b.html
new file mode 100644
index 0000000..80a061f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/023b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>023b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "023" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "023c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ also provides informational methods
+
+ * $meta-&gt;class_precedence_list
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/023c.html b/static/talks/extending_moose_yapc_na_2010/023c.html
new file mode 100644
index 0000000..cc76ea1
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/023c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>023c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "023b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "023z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ also provides informational methods
+
+ * $meta-&gt;class_precedence_list
+ * $meta-&gt;has_method('foo')
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/023z.html b/static/talks/extending_moose_yapc_na_2010/023z.html
new file mode 100644
index 0000000..15e1a9f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/023z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>023z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "023c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "024" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ also provides informational methods
+
+ * $meta-&gt;class_precedence_list
+ * $meta-&gt;has_method('foo')
+ * $meta-&gt;does_role('Role')
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/024.html b/static/talks/extending_moose_yapc_na_2010/024.html
new file mode 100644
index 0000000..dfe10cf
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/024.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>024</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "023z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "024b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ and provides other functionality specific to the mop
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/024b.html b/static/talks/extending_moose_yapc_na_2010/024b.html
new file mode 100644
index 0000000..bc9e7eb
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/024b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>024b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "024" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "024c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ and provides other functionality specific to the mop
+
+ * $meta-&gt;make_immutable
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/024c.html b/static/talks/extending_moose_yapc_na_2010/024c.html
new file mode 100644
index 0000000..eff147a
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/024c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>024c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "024b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "024z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ and provides other functionality specific to the mop
+
+ * $meta-&gt;make_immutable
+ * $meta-&gt;new_object
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/024z.html b/static/talks/extending_moose_yapc_na_2010/024z.html
new file mode 100644
index 0000000..4377e46
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/024z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>024z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "024c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "025" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ and provides other functionality specific to the mop
+
+ * $meta-&gt;make_immutable
+ * $meta-&gt;new_object
+ * Moose::Meta::Class-&gt;create_anon_class
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/025.html b/static/talks/extending_moose_yapc_na_2010/025.html
new file mode 100644
index 0000000..8c0fb47
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/025.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>025</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "024z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "026" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ Moose::Meta::Attribute
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/026.html b/static/talks/extending_moose_yapc_na_2010/026.html
new file mode 100644
index 0000000..de53cf0
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/026.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>026</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "025" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "026b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ accessed through $meta-&gt;get_attribute, etc
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/026b.html b/static/talks/extending_moose_yapc_na_2010/026b.html
new file mode 100644
index 0000000..f17a95d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/026b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>026b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "026" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "026z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ accessed through $meta-&gt;get_attribute, etc
+
+ stores data associated with an object
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/026z.html b/static/talks/extending_moose_yapc_na_2010/026z.html
new file mode 100644
index 0000000..333da3d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/026z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>026z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "026b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "027" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ accessed through $meta-&gt;get_attribute, etc
+
+ stores data associated with an object
+
+ also handles installing methods associated with accessing that data
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/027.html b/static/talks/extending_moose_yapc_na_2010/027.html
new file mode 100644
index 0000000..c005bdb
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/027.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>027</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "026z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "027b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ informational methods:
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/027b.html b/static/talks/extending_moose_yapc_na_2010/027b.html
new file mode 100644
index 0000000..70ac8e8
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/027b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>027b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "027" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "027z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ informational methods:
+
+ * $meta_attr-&gt;get_read_method
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/027z.html b/static/talks/extending_moose_yapc_na_2010/027z.html
new file mode 100644
index 0000000..ecd850c
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/027z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>027z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "027b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "028" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ informational methods:
+
+ * $meta_attr-&gt;get_read_method
+ * $meta_attr-&gt;type_constraint
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/028.html b/static/talks/extending_moose_yapc_na_2010/028.html
new file mode 100644
index 0000000..7c3bbc4
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/028.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>028</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "027z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "028z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ accessing data handled by the attribute
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/028z.html b/static/talks/extending_moose_yapc_na_2010/028z.html
new file mode 100644
index 0000000..f39c97b
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/028z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>028z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "028" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "029" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ accessing data handled by the attribute
+
+ $meta_attr-&gt;get_value($obj)
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/029.html b/static/talks/extending_moose_yapc_na_2010/029.html
new file mode 100644
index 0000000..b938d34
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/029.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>029</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "028z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "030" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ Moose::Meta::Method
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/030.html b/static/talks/extending_moose_yapc_na_2010/030.html
new file mode 100644
index 0000000..b864827
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/030.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>030</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "029" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "030b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ accessed through $meta-&gt;get_method, etc
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/030b.html b/static/talks/extending_moose_yapc_na_2010/030b.html
new file mode 100644
index 0000000..9863b08
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/030b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>030b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "030" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "030c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ accessed through $meta-&gt;get_method, etc
+
+ represents a method associated with a class
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/030c.html b/static/talks/extending_moose_yapc_na_2010/030c.html
new file mode 100644
index 0000000..194dce3
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/030c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>030c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "030b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "030z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ accessed through $meta-&gt;get_method, etc
+
+ represents a method associated with a class
+
+ these are typically introspected from the symbol table, not created explicitly
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/030z.html b/static/talks/extending_moose_yapc_na_2010/030z.html
new file mode 100644
index 0000000..f22650e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/030z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>030z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "030c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "031" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ accessed through $meta-&gt;get_method, etc
+
+ represents a method associated with a class
+
+ these are typically introspected from the symbol table, not created explicitly
+
+ they can be created explicitly if necessary; this is how method modifiers work
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/031.html b/static/talks/extending_moose_yapc_na_2010/031.html
new file mode 100644
index 0000000..35c8df2
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/031.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>031</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "030z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "032" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ so how does this all work?
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/032.html b/static/talks/extending_moose_yapc_na_2010/032.html
new file mode 100644
index 0000000..2397bac
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/032.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>032</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "031" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "033" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ metacircularity
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/033.html b/static/talks/extending_moose_yapc_na_2010/033.html
new file mode 100644
index 0000000..19058b2
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/033.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>033</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "032" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "033b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ metaclasses are instances of the class Moose::Meta::Class
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/033b.html b/static/talks/extending_moose_yapc_na_2010/033b.html
new file mode 100644
index 0000000..2b0905d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/033b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>033b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "033" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "033z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ metaclasses are instances of the class Moose::Meta::Class
+
+ but Moose::Meta::Class is itself a class
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/033z.html b/static/talks/extending_moose_yapc_na_2010/033z.html
new file mode 100644
index 0000000..41d5355
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/033z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>033z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "033b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "034" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ metaclasses are instances of the class Moose::Meta::Class
+
+ but Moose::Meta::Class is itself a class
+
+ so it must have a metaclass
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/034.html b/static/talks/extending_moose_yapc_na_2010/034.html
new file mode 100644
index 0000000..a7c2160
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/034.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>034</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "033z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "035" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ this is accomplished by two tricks
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/035.html b/static/talks/extending_moose_yapc_na_2010/035.html
new file mode 100644
index 0000000..2cdfecb
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/035.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>035</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "034" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "035z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ compiler bootstrapping
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/035z.html b/static/talks/extending_moose_yapc_na_2010/035z.html
new file mode 100644
index 0000000..1a8b464
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/035z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>035z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "035" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "036" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ compiler bootstrapping
+
+ write a basic version first, replace it with the actual version once the structure is in place
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/036.html b/static/talks/extending_moose_yapc_na_2010/036.html
new file mode 100644
index 0000000..b989513
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/036.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>036</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "035z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "036z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ Moose::Meta::Class has a metaclass, but it's also a Moose::Meta::Class
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/036z.html b/static/talks/extending_moose_yapc_na_2010/036z.html
new file mode 100644
index 0000000..a784d1e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/036z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>036z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "036" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "037" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ Moose::Meta::Class has a metaclass, but it's also a Moose::Meta::Class
+
+ so Class-&gt;meta-&gt;meta == Class-&gt;meta
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/037.html b/static/talks/extending_moose_yapc_na_2010/037.html
new file mode 100644
index 0000000..177075e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/037.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>037</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "036z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "038" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ but this is mostly irrelevant
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/038.html b/static/talks/extending_moose_yapc_na_2010/038.html
new file mode 100644
index 0000000..717a608
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/038.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>038</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "037" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "038z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ the idea to take away is that moose is built on top of moose
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/038z.html b/static/talks/extending_moose_yapc_na_2010/038z.html
new file mode 100644
index 0000000..7e99519
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/038z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>038z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "038" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "039" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ the idea to take away is that moose is built on top of moose
+
+ and so it can be extended just like any other moose object
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/039.html b/static/talks/extending_moose_yapc_na_2010/039.html
new file mode 100644
index 0000000..3139ede
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/039.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>039</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "038z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "040" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ so we have this foundation, but how can we make this easy to use?
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/040.html b/static/talks/extending_moose_yapc_na_2010/040.html
new file mode 100644
index 0000000..6f033bf
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/040.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>040</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "039" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "041" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ Moose::Exporter
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/041.html b/static/talks/extending_moose_yapc_na_2010/041.html
new file mode 100644
index 0000000..d7626ff
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/041.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>041</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "040" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "041z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ we have __PACKAGE__-&gt;meta-&gt;add_attribute(foo =&gt; (is =&gt; 'ro'))
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/041z.html b/static/talks/extending_moose_yapc_na_2010/041z.html
new file mode 100644
index 0000000..867de5e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/041z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>041z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "041" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "042" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+ we have __PACKAGE__-&gt;meta-&gt;add_attribute(foo =&gt; (is =&gt; 'ro'))
+
+ but we'd like &quot;has foo =&gt; (is =&gt; 'ro')&quot;
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/042.html b/static/talks/extending_moose_yapc_na_2010/042.html
new file mode 100644
index 0000000..47d345e
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/042.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>042</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "041z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "042b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose::Exporter is a wrapper around Sub::Exporter providing moose-specific functionality
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/042b.html b/static/talks/extending_moose_yapc_na_2010/042b.html
new file mode 100644
index 0000000..9b05428
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/042b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>042b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "042" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "042z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose::Exporter is a wrapper around Sub::Exporter providing moose-specific functionality
+
+ can curry the metaclass into helper functions
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/042z.html b/static/talks/extending_moose_yapc_na_2010/042z.html
new file mode 100644
index 0000000..95e78d7
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/042z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>042z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "042b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "043" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose::Exporter is a wrapper around Sub::Exporter providing moose-specific functionality
+
+ can curry the metaclass into helper functions
+
+ can pass arguments to Moose::Util::MetaRole to customize the metaclasses
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/043.html b/static/talks/extending_moose_yapc_na_2010/043.html
new file mode 100644
index 0000000..c9d052f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/043.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>043</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "042z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "043b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose itself uses Moose::Exporter
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/043b.html b/static/talks/extending_moose_yapc_na_2010/043b.html
new file mode 100644
index 0000000..c6f0556
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/043b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>043b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "043" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "043z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose itself uses Moose::Exporter
+
+ 'has' is a thin wrapper around __PACKAGE__-&gt;meta-&gt;add_attribute
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/043z.html b/static/talks/extending_moose_yapc_na_2010/043z.html
new file mode 100644
index 0000000..cb34df7
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/043z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>043z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "043b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "044" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ Moose itself uses Moose::Exporter
+
+ 'has' is a thin wrapper around __PACKAGE__-&gt;meta-&gt;add_attribute
+
+ read the source to Moose.pm, it's pretty simple
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/044.html b/static/talks/extending_moose_yapc_na_2010/044.html
new file mode 100644
index 0000000..f36b3ae
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/044.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>044</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "043z" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "045" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ so the key here is that all of these metaclasses can be customized, and Moose::Exporter can wrap those customizations to make them pretty
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/045.html b/static/talks/extending_moose_yapc_na_2010/045.html
new file mode 100644
index 0000000..cceaf7b
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/045.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>045</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "044" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "046.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ basic extensions don't even need to alter the metaclass
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/046.pl.html b/static/talks/extending_moose_yapc_na_2010/046.pl.html
new file mode 100644
index 0000000..d7606ec
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/046.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>046.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "045" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "047.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> package FileAttributes;
+ use Moose::Exporter;
+ use MooseX::Types::Path::Class qw(File);
+
+ Moose::Exporter-&gt;setup_import_methods(
+ with_meta =&gt; ['has_file'],
+ );
+
+ sub has_file {
+ my ($meta, $name, %options) = @_;
+ $meta-&gt;add_attribute(
+ $name,
+ is =&gt; 'ro',
+ isa =&gt; File,
+ coerce =&gt; 1,
+ %options,
+ );
+ }
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/047.pl.html b/static/talks/extending_moose_yapc_na_2010/047.pl.html
new file mode 100644
index 0000000..de2cf6b
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/047.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>047.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "046.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "048" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ package Foo;
+ use Moose;
+ use FileAttributes;
+
+ has_file 'foo';
+ has_file 'bar' =&gt; (required =&gt; 1);
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/048.html b/static/talks/extending_moose_yapc_na_2010/048.html
new file mode 100644
index 0000000..06e902f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/048.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>048</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "047.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "049.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ but altering metaclasses can provide more powerful abstractions
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/049.pl.html b/static/talks/extending_moose_yapc_na_2010/049.pl.html
new file mode 100644
index 0000000..cdd2d70
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/049.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>049.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "048" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "050.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+ package AtomicMethod::Role::Method;
+ use Moose::Role;
+
+ around wrap =&gt; sub {
+ my ($orig, $self, $body, @args) = @_;
+ my $new_body = sub {
+ warn &quot;locking...\n&quot;; # or something more useful
+ my @ret = $body-&gt;(@_); # TODO: handle context properly
+ warn &quot;unlocking...\n&quot;; # or something more useful
+ return @ret;
+ };
+ $self-&gt;$orig($new_body, @args);
+ };
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/050.pl.html b/static/talks/extending_moose_yapc_na_2010/050.pl.html
new file mode 100644
index 0000000..b22e48f
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/050.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>050.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "049.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "050z.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> and make it pretty
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/050z.pl.html b/static/talks/extending_moose_yapc_na_2010/050z.pl.html
new file mode 100644
index 0000000..ca7312d
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/050z.pl.html
@@ -0,0 +1,57 @@
+<html>
+<head>
+<title>050z.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "050.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "051.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> and make it pretty
+
+ package AtomicMethod;
+ use Moose::Exporter;
+
+ Moose::Exporter-&gt;setup_import_methods(
+ with_meta =&gt; [qw(atomic_method)],
+ );
+
+ sub _atomic_method_meta {
+ my ($meta) = @_;
+ Moose::Meta::Class-&gt;create_anon_class(
+ superclasses =&gt; [$meta-&gt;method_metaclass],
+ roles =&gt; ['AtomicMethod::Role::Method'],
+ cache =&gt; 1,
+ )-&gt;name;
+ }
+
+ sub atomic_method {
+ my ($meta, $name, $code) = @_;
+ $meta-&gt;add_method(
+ $name =&gt; _atomic_method_meta($meta)-&gt;wrap(
+ $code,
+ name =&gt; $name,
+ package_name =&gt; $meta-&gt;name,
+ associated_metaclass =&gt; $meta
+ ),
+ );
+ }
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/051.pl.html b/static/talks/extending_moose_yapc_na_2010/051.pl.html
new file mode 100644
index 0000000..cc98caa
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/051.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>051.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "050z.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "052" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+ package Foo;
+ use Moose;
+ use AtomicMethod;
+
+ atomic_method foo =&gt; sub {
+ warn &quot;in foo\n&quot;;
+ };
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/052.html b/static/talks/extending_moose_yapc_na_2010/052.html
new file mode 100644
index 0000000..31c2f59
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/052.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>052</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "051.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "053.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ combining metaclass alterations can be even more powerful
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/053.pl.html b/static/talks/extending_moose_yapc_na_2010/053.pl.html
new file mode 100644
index 0000000..7eecef6
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/053.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>053.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "052" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "054.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ package Command::Role::Method;
+ use Moose::Role;
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/054.pl.html b/static/talks/extending_moose_yapc_na_2010/054.pl.html
new file mode 100644
index 0000000..b946994
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/054.pl.html
@@ -0,0 +1,52 @@
+<html>
+<head>
+<title>054.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "053.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "055.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> package Command::Role::Class;
+ use Moose::Role;
+
+ sub get_all_commands {
+ my ($self) = @_;
+ grep { Moose::Util::does_role($_, 'Command::Role::Method') }
+ $self-&gt;get_all_methods;
+ }
+
+ sub has_command {
+ my ($self, $name) = @_;
+ my $method = $self-&gt;find_method_by_name($name);
+ return unless $method;
+ return Moose::Util::does_role($method, 'Command::Role::Method');
+ }
+
+ sub get_command {
+ my ($self, $name) = @_;
+ my $method = $self-&gt;find_method_by_name($name);
+ return unless $method;
+ return Moose::Util::does_role($method, 'Command::Role::Method')
+ ? $method
+ : ();
+ }
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/055.pl.html b/static/talks/extending_moose_yapc_na_2010/055.pl.html
new file mode 100644
index 0000000..84c098a
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/055.pl.html
@@ -0,0 +1,58 @@
+<html>
+<head>
+<title>055.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "054.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "056.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> package Command;
+ use Moose::Exporter;
+
+ Moose::Exporter-&gt;setup_import_methods(
+ with_meta =&gt; ['command'],
+ class_metaroles =&gt; {
+ class =&gt; ['Command::Role::Class'],
+ },
+ );
+
+ sub _command_method_meta {
+ my ($meta) = @_;
+ Moose::Meta::Class-&gt;create_anon_class(
+ superclasses =&gt; [$meta-&gt;method_metaclass],
+ roles =&gt; ['Command::Role::Method'],
+ cache =&gt; 1,
+ )-&gt;name;
+ }
+
+ sub command {
+ my ($meta, $name, $code) = @_;
+ $meta-&gt;add_method(
+ $name =&gt; _command_method_meta($meta)-&gt;wrap(
+ $code,
+ name =&gt; $name,
+ package_name =&gt; $meta-&gt;name,
+ associated_metaclass =&gt; $meta
+ ),
+ );
+ }
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/056.pl.html b/static/talks/extending_moose_yapc_na_2010/056.pl.html
new file mode 100644
index 0000000..1aed6f2
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/056.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>056.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "055.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "057.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ package Foo;
+ use Moose;
+ use Command;
+
+ command bar =&gt; sub { ... };
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/057.pl.html b/static/talks/extending_moose_yapc_na_2010/057.pl.html
new file mode 100644
index 0000000..e7c7064
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/057.pl.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>057.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "056.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "058" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+ package My::App;
+ use Moose;
+ use Foo;
+
+ sub run {
+ my ($self, $cmd) = @_;
+ if (Foo-&gt;meta-&gt;has_command($cmd)) {
+ Foo-&gt;new-&gt;$cmd;
+ }
+ elsif ($cmd eq 'cmdlist') {
+ print join ', ', map { $_-&gt;name } Foo-&gt;meta-&gt;get_all_commands;
+ }
+ }
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/058.html b/static/talks/extending_moose_yapc_na_2010/058.html
new file mode 100644
index 0000000..edde0f5
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/058.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>058</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "057.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "059.pl" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ for larger projects, providing a custom exporter can simplify things greatly
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/059.pl.html b/static/talks/extending_moose_yapc_na_2010/059.pl.html
new file mode 100644
index 0000000..673f2f2
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/059.pl.html
@@ -0,0 +1,59 @@
+<html>
+<head>
+<title>059.pl</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "058" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "060" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre> package Mooose;
+ use Moose::Exporter;
+ use MooseX::NonMoose ();
+ use MooseX::Aliases ();
+
+ my ($import, $unimport, $init_meta) = Moose::Exporter-&gt;build_import_methods(
+ also =&gt; ['MooseX::NonMoose', 'MooseX::Aliases'],
+ class_metaroles =&gt; {
+ class =&gt; ['My::App::Meta::Class'],
+ },
+ );
+
+ sub import {
+ strict-&gt;import;
+ warnings-&gt;import;
+ autodie-&gt;import;
+ feature-&gt;import(':5.10');
+ MooseX::Aliases-&gt;import;
+ goto $import;
+ }
+
+ sub unimport {
+ # .... (s/import/unimport/ on the above)
+ goto $unimport;
+ }
+
+ sub init_meta {
+ my ($package, %options) = @_;
+ die unless $options{for_class}-&gt;isa('My::Base::Class');
+ goto $init_meta;
+ }
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/060.html b/static/talks/extending_moose_yapc_na_2010/060.html
new file mode 100644
index 0000000..2202e92
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/060.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>060</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "059.pl" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "061" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ the positive side
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/061.html b/static/talks/extending_moose_yapc_na_2010/061.html
new file mode 100644
index 0000000..bf9f0b9
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/061.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>061</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "060" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "061b" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ these things are easily packaged up into standalone modules
+
+
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/061b.html b/static/talks/extending_moose_yapc_na_2010/061b.html
new file mode 100644
index 0000000..7fba6d3
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/061b.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>061b</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "061" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "061c" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ these things are easily packaged up into standalone modules
+
+ * MooseX::FileAttributes
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/061c.html b/static/talks/extending_moose_yapc_na_2010/061c.html
new file mode 100644
index 0000000..9681a82
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/061c.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>061c</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "061b" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "061d" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ these things are easily packaged up into standalone modules
+
+ * MooseX::FileAttributes
+ * MooseX::TransactionalMethods
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/061d.html b/static/talks/extending_moose_yapc_na_2010/061d.html
new file mode 100644
index 0000000..603d4d1
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/061d.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>061d</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "061c" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "061z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ these things are easily packaged up into standalone modules
+
+ * MooseX::FileAttributes
+ * MooseX::TransactionalMethods
+ * IM::Engine::Plugin::Commands
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/061z.html b/static/talks/extending_moose_yapc_na_2010/061z.html
new file mode 100644
index 0000000..a344b82
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/061z.html
@@ -0,0 +1,46 @@
+<html>
+<head>
+<title>061z</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "061d" + ".html";
+ return false;
+ }
+ if (keynum == 13 || keynum == 32) {
+ window.location = "062" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+ these things are easily packaged up into standalone modules
+
+ * MooseX::FileAttributes
+ * MooseX::TransactionalMethods
+ * IM::Engine::Plugin::Commands
+ * Blawd::OO, TAEB::OO, etc...
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/062.html b/static/talks/extending_moose_yapc_na_2010/062.html
new file mode 100644
index 0000000..49d74df
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/062.html
@@ -0,0 +1,42 @@
+<html>
+<head>
+<title>062</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 8) {
+ window.location = "061z" + ".html";
+ return false;
+ }
+ if (keynum == 73 || keynum == 105) {
+ window.location = "index.html";
+ return false;
+ }
+ return true;
+}
+</script>
+</head>
+<body onkeypress="return navigate(event)">
+<pre>
+
+
+
+
+
+
+ any questions?
+
+
+
+
+
+
+
+
+
+
+</pre>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/index.html b/static/talks/extending_moose_yapc_na_2010/index.html
new file mode 100644
index 0000000..c894505
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/index.html
@@ -0,0 +1,97 @@
+<html>
+<head>
+<title>Extending Moose</title>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<script>
+function navigate(e) {
+ var keynum = (window.event) // IE
+ ? e.keyCode
+ : e.which;
+ if (keynum == 13 || keynum == 32) {
+ window.location = "001.html";
+ return false;
+ }
+ return true;
+}
+</script>
+<style>
+body {
+ font-family: sans-serif;
+}
+h4 {
+ color: #888;
+}
+</style>
+</head>
+<body>
+<h4>Use SPACEBAR to peruse the slides or click one to start...<h4>
+<h1>Extending Moose</h1>
+<ul>
+<li><a href="001.html">Extending Moose</a></li>
+<li><a href="002.html">motivation</a></li>
+<li><a href="003.html">moose</a></li>
+<li><a href="004.html">using only the basic features doesn't gain you much</a></li>
+<li><a href="005.pl.html">package Foo;</a></li>
+<li><a href="006.pl.html">package Foo;</a></li>
+<li><a href="007.pl.html">but...</a></li>
+<li><a href="008.html">moose gives you more than this</a></li>
+<li><a href="009.html">but the real power of moose is in extensibility</a></li>
+<li><a href="010.html">typical object systems are defined in terms of, well, object systems</a></li>
+<li><a href="011.html">code should be written with the intent of communicating with *humans*</a></li>
+<li><a href="012.html">this has different levels:</a></li>
+<li><a href="013.html">perl:</a></li>
+<li><a href="014.html">moose (by default):</a></li>
+<li><a href="015.html">but what we'd really like is:</a></li>
+<li><a href="016.html">moose can give us this too</a></li>
+<li><a href="017.html">the mop</a></li>
+<li><a href="018.html">models classes as objects</a></li>
+<li><a href="019.html">every class is represented by a metaclass</a></li>
+<li><a href="020.html">Moose::Meta::Class</a></li>
+<li><a href="021.html">access these objects through Class-&gt;meta (a class method installed by &quot;use Moose&quot;)</a></li>
+<li><a href="022.html">class information is stored and manipulated through these objects</a></li>
+<li><a href="023.html">also provides informational methods</a></li>
+<li><a href="024.html">and provides other functionality specific to the mop</a></li>
+<li><a href="025.html">Moose::Meta::Attribute</a></li>
+<li><a href="026.html">accessed through $meta-&gt;get_attribute, etc</a></li>
+<li><a href="027.html">informational methods:</a></li>
+<li><a href="028.html">accessing data handled by the attribute</a></li>
+<li><a href="029.html">Moose::Meta::Method</a></li>
+<li><a href="030.html">accessed through $meta-&gt;get_method, etc</a></li>
+<li><a href="031.html">so how does this all work?</a></li>
+<li><a href="032.html">metacircularity</a></li>
+<li><a href="033.html">metaclasses are instances of the class Moose::Meta::Class</a></li>
+<li><a href="034.html">this is accomplished by two tricks</a></li>
+<li><a href="035.html">compiler bootstrapping</a></li>
+<li><a href="036.html">Moose::Meta::Class has a metaclass, but it's also a Moose::Meta::Class</a></li>
+<li><a href="037.html">but this is mostly irrelevant</a></li>
+<li><a href="038.html">the idea to take away is that moose is built on top of moose</a></li>
+<li><a href="039.html">so we have this foundation, but how can we make this easy to use?</a></li>
+<li><a href="040.html">Moose::Exporter</a></li>
+<li><a href="041.html">we have __PACKAGE__-&gt;meta-&gt;add_attribute(foo =&gt; (is =&gt; 'ro'))</a></li>
+<li><a href="042.html">Moose::Exporter is a wrapper around Sub::Exporter providing moose-specific functionality</a></li>
+<li><a href="043.html">Moose itself uses Moose::Exporter</a></li>
+<li><a href="044.html">so the key here is that all of these metaclasses can be customized, and Moose::Exporter can wrap those customizations to make them pretty</a></li>
+<li><a href="045.html">basic extensions don't even need to alter the metaclass</a></li>
+<li><a href="046.pl.html">package FileAttributes;</a></li>
+<li><a href="047.pl.html">package Foo;</a></li>
+<li><a href="048.html">but altering metaclasses can provide more powerful abstractions</a></li>
+<li><a href="049.pl.html">package AtomicMethod::Role::Method;</a></li>
+<li><a href="050.pl.html">and make it pretty</a></li>
+<li><a href="051.pl.html">package Foo;</a></li>
+<li><a href="052.html">combining metaclass alterations can be even more powerful</a></li>
+<li><a href="053.pl.html">package Command::Role::Method;</a></li>
+<li><a href="054.pl.html">package Command::Role::Class;</a></li>
+<li><a href="055.pl.html">package Command;</a></li>
+<li><a href="056.pl.html">package Foo;</a></li>
+<li><a href="057.pl.html">package My::App;</a></li>
+<li><a href="058.html">for larger projects, providing a custom exporter can simplify things greatly</a></li>
+<li><a href="059.pl.html">package Mooose;</a></li>
+<li><a href="060.html">the positive side</a></li>
+<li><a href="061.html">these things are easily packaged up into standalone modules</a></li>
+<li><a href="062.html">any questions?</a></li>
+</ul>
+<p>This presentation was generated by <a
+href="http://ingydotnet.github.com/vroom-pm">Vroom</a>. Use &lt;SPACE&gt; key to go
+forward and &lt;BACKSPACE&gt; to go backwards.
+</p>
+</body>
diff --git a/static/talks/extending_moose_yapc_na_2010/slides.vroom b/static/talks/extending_moose_yapc_na_2010/slides.vroom
new file mode 100644
index 0000000..7f27df3
--- /dev/null
+++ b/static/talks/extending_moose_yapc_na_2010/slides.vroom
@@ -0,0 +1,399 @@
+---- config
+title: Extending Moose
+indent: 8
+height: 18
+width: 69
+skip: 0
+
+---- center
+Extending Moose
+
+by Jesse Luehrs (doy at tozt dot net)
+
+----
+== motivation
+----
+moose
+
++great class builder
+
++lots of beginner info available
+----
+using only the basic features doesn't gain you much
+---- perl,i4
+package Foo;
+use base qw(Class::Accessor);
+__PACKAGE__->mk_accessors('bar');
+---- perl,i4
+package Foo;
+use Moose;
+has bar => (is => 'ro');
+---- perl,i4
+but...
+
++package Foo;
+use Class::Accessor 'antlers';
+has bar => (is => 'ro');
+----
+moose gives you more than this
+
++* builders
++* delegation
++* roles
++* etc...
+----
+but the real power of moose is in extensibility
+----
+typical object systems are defined in terms of, well, object systems
+
++has input_file => (
+ is => 'ro',
+ isa => File,
+ coerce => 1,
+ required => 1,
+);
+
++wouldn't it be nice to be able to say what we mean?
+
++has_file 'input_file';
+----
+code should be written with the intent of communicating with *humans*
+
++computers are great at figuring out the details on their own
+
++write code in the language of the domain rather than the language of the computer
+----
+this has different levels:
+----
+perl:
+
+a user is a hash table with a key storing the username and a key storing the password, associated with a set of functions for manipulating those hash keys while validating them and ensuring they remain consistent
+----
+moose (by default):
+
+a user has a readonly string attribute storing the username, and a read/write Authen::Passphrase object storing the password, which password checking is delegated to
+----
+but what we'd really like is:
+
+a user has a name, and you can ask if its password is correct
+----
+moose can give us this too
+----
+== the mop
+
++== (meta object protocol)
+----
+models classes as objects
+----
+every class is represented by a metaclass
+
++a normal perl object of the class Moose::Meta::Class
+
++contains attributes and methods as members (objects of Moose::Meta::Attribute and Moose::Meta::Method)
+
++(other stuff too, but we'll ignore that for now)
+----
+== Moose::Meta::Class
+----
+access these objects through Class->meta (a class method installed by "use Moose")
+----
+class information is stored and manipulated through these objects
+
++* "@ISA = ('Foo')" -> "$meta->superclasses('Foo')"
++* "*foo = sub { ... }" -> "$meta->add_method(foo => sub { ... })"
++* "our $foo = 'bar'" -> "$meta->add_package_symbol('$foo' => 'bar')"
+----
+also provides informational methods
+
++* $meta->class_precedence_list
++* $meta->has_method('foo')
++* $meta->does_role('Role')
+----
+and provides other functionality specific to the mop
+
++* $meta->make_immutable
++* $meta->new_object
++* Moose::Meta::Class->create_anon_class
+----
+== Moose::Meta::Attribute
+----
+accessed through $meta->get_attribute, etc
+
++stores data associated with an object
+
++also handles installing methods associated with accessing that data
+----
+informational methods:
+
++* $meta_attr->get_read_method
++* $meta_attr->type_constraint
+----
+accessing data handled by the attribute
+
++$meta_attr->get_value($obj)
+----
+== Moose::Meta::Method
+----
+accessed through $meta->get_method, etc
+
++represents a method associated with a class
+
++these are typically introspected from the symbol table, not created explicitly
+
++they can be created explicitly if necessary; this is how method modifiers work
+----
+so how does this all work?
+----
+== metacircularity
+----
+metaclasses are instances of the class Moose::Meta::Class
+
++but Moose::Meta::Class is itself a class
+
++so it must have a metaclass
+----
+this is accomplished by two tricks
+----
+compiler bootstrapping
+
++write a basic version first, replace it with the actual version once the structure is in place
+----
+Moose::Meta::Class has a metaclass, but it's also a Moose::Meta::Class
+
++so Class->meta->meta == Class->meta
+----
+but this is mostly irrelevant
+----
+the idea to take away is that moose is built on top of moose
+
++and so it can be extended just like any other moose object
+----
+so we have this foundation, but how can we make this easy to use?
+----
+== Moose::Exporter
+----
+we have __PACKAGE__->meta->add_attribute(foo => (is => 'ro'))
+
++but we'd like "has foo => (is => 'ro')"
+----
+Moose::Exporter is a wrapper around Sub::Exporter providing moose-specific functionality
+
++can curry the metaclass into helper functions
+
++can pass arguments to Moose::Util::MetaRole to customize the metaclasses
+----
+Moose itself uses Moose::Exporter
+
++'has' is a thin wrapper around __PACKAGE__->meta->add_attribute
+
++read the source to Moose.pm, it's pretty simple
+----
+so the key here is that all of these metaclasses can be customized, and Moose::Exporter can wrap those customizations to make them pretty
+----
+basic extensions don't even need to alter the metaclass
+---- perl,i4
+package FileAttributes;
+use Moose::Exporter;
+use MooseX::Types::Path::Class qw(File);
+
+Moose::Exporter->setup_import_methods(
+ with_meta => ['has_file'],
+);
+
+sub has_file {
+ my ($meta, $name, %options) = @_;
+ $meta->add_attribute(
+ $name,
+ is => 'ro',
+ isa => File,
+ coerce => 1,
+ %options,
+ );
+}
+---- perl,i4
+package Foo;
+use Moose;
+use FileAttributes;
+
+has_file 'foo';
+has_file 'bar' => (required => 1);
+----
+but altering metaclasses can provide more powerful abstractions
+---- perl,i4
+package AtomicMethod::Role::Method;
+use Moose::Role;
+
+around wrap => sub {
+ my ($orig, $self, $body, @args) = @_;
+ my $new_body = sub {
+ warn "locking...\n"; # or something more useful
+ my @ret = $body->(@_); # TODO: handle context properly
+ warn "unlocking...\n"; # or something more useful
+ return @ret;
+ };
+ $self->$orig($new_body, @args);
+};
+---- perl,i4
+and make it pretty
+
++package AtomicMethod;
+use Moose::Exporter;
+
+Moose::Exporter->setup_import_methods(
+ with_meta => [qw(atomic_method)],
+);
+
+sub _atomic_method_meta {
+ my ($meta) = @_;
+ Moose::Meta::Class->create_anon_class(
+ superclasses => [$meta->method_metaclass],
+ roles => ['AtomicMethod::Role::Method'],
+ cache => 1,
+ )->name;
+}
+
+sub atomic_method {
+ my ($meta, $name, $code) = @_;
+ $meta->add_method(
+ $name => _atomic_method_meta($meta)->wrap(
+ $code,
+ name => $name,
+ package_name => $meta->name,
+ associated_metaclass => $meta
+ ),
+ );
+}
+---- perl,i4
+package Foo;
+use Moose;
+use AtomicMethod;
+
+atomic_method foo => sub {
+ warn "in foo\n";
+};
+----
+combining metaclass alterations can be even more powerful
+---- perl,i4
+package Command::Role::Method;
+use Moose::Role;
+---- perl,i4
+package Command::Role::Class;
+use Moose::Role;
+
+sub get_all_commands {
+ my ($self) = @_;
+ grep { Moose::Util::does_role($_, 'Command::Role::Method') }
+ $self->get_all_methods;
+}
+
+sub has_command {
+ my ($self, $name) = @_;
+ my $method = $self->find_method_by_name($name);
+ return unless $method;
+ return Moose::Util::does_role($method, 'Command::Role::Method');
+}
+
+sub get_command {
+ my ($self, $name) = @_;
+ my $method = $self->find_method_by_name($name);
+ return unless $method;
+ return Moose::Util::does_role($method, 'Command::Role::Method')
+ ? $method
+ : ();
+}
+---- perl,i4
+package Command;
+use Moose::Exporter;
+
+Moose::Exporter->setup_import_methods(
+ with_meta => ['command'],
+ class_metaroles => {
+ class => ['Command::Role::Class'],
+ },
+);
+
+sub _command_method_meta {
+ my ($meta) = @_;
+ Moose::Meta::Class->create_anon_class(
+ superclasses => [$meta->method_metaclass],
+ roles => ['Command::Role::Method'],
+ cache => 1,
+ )->name;
+}
+
+sub command {
+ my ($meta, $name, $code) = @_;
+ $meta->add_method(
+ $name => _command_method_meta($meta)->wrap(
+ $code,
+ name => $name,
+ package_name => $meta->name,
+ associated_metaclass => $meta
+ ),
+ );
+}
+---- perl,i4
+package Foo;
+use Moose;
+use Command;
+
+command bar => sub { ... };
+---- perl,i4
+package My::App;
+use Moose;
+use Foo;
+
+sub run {
+ my ($self, $cmd) = @_;
+ if (Foo->meta->has_command($cmd)) {
+ Foo->new->$cmd;
+ }
+ elsif ($cmd eq 'cmdlist') {
+ print join ', ', map { $_->name } Foo->meta->get_all_commands;
+ }
+}
+----
+for larger projects, providing a custom exporter can simplify things greatly
+---- perl,i4
+package Mooose;
+use Moose::Exporter;
+use MooseX::NonMoose ();
+use MooseX::Aliases ();
+
+my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods(
+ also => ['MooseX::NonMoose', 'MooseX::Aliases'],
+ class_metaroles => {
+ class => ['My::App::Meta::Class'],
+ },
+);
+
+sub import {
+ strict->import;
+ warnings->import;
+ autodie->import;
+ feature->import(':5.10');
+ MooseX::Aliases->import;
+ goto $import;
+}
+
+sub unimport {
+ # .... (s/import/unimport/ on the above)
+ goto $unimport;
+}
+
+sub init_meta {
+ my ($package, %options) = @_;
+ die unless $options{for_class}->isa('My::Base::Class');
+ goto $init_meta;
+}
+----
+the positive side
+----
+these things are easily packaged up into standalone modules
+
++* MooseX::FileAttributes
++* MooseX::TransactionalMethods
++* IM::Engine::Plugin::Commands
++* Blawd::OO, TAEB::OO, etc...
+---- center
+any questions?