diff options
Diffstat (limited to 'static/talks/extending_moose_yapc_na_2010')
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__->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 => (is => '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 => (is => '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 => ( + is => 'ro', + isa => File, + coerce => 1, + required => 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 => ( + is => 'ro', + isa => File, + coerce => 1, + required => 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 => ( + 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'; + + + + +</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->meta (a class method installed by "use Moose") + + + + + + + + + + +</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 + + * "@ISA = ('Foo')" -> "$meta->superclasses('Foo')" + + + + + + + + + + +</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 + + * "@ISA = ('Foo')" -> "$meta->superclasses('Foo')" + * "*foo = sub { ... }" -> "$meta->add_method(foo => sub { ... })" + + + + + + + + + +</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 + + * "@ISA = ('Foo')" -> "$meta->superclasses('Foo')" + * "*foo = sub { ... }" -> "$meta->add_method(foo => sub { ... })" + * "our $foo = 'bar'" -> "$meta->add_package_symbol('$foo' => 'bar')" + + + + + + + + +</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->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->class_precedence_list + * $meta->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->class_precedence_list + * $meta->has_method('foo') + * $meta->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->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->make_immutable + * $meta->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->make_immutable + * $meta->new_object + * Moose::Meta::Class->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->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->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->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->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->get_read_method + * $meta_attr->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->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->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->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->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->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->meta->meta == Class->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__->meta->add_attribute(foo => (is => '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__->meta->add_attribute(foo => (is => 'ro')) + + but we'd like "has foo => (is => 'ro')" + + + + + + + + + +</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__->meta->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__->meta->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->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, + ); + } +</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' => (required => 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 => 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); + }; + + + + +</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->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 + ), + ); + } +</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 => sub { + warn "in foo\n"; + }; + + + + + + + +</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->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 + : (); + } +</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->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 + ), + ); + } +</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 => 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->meta->has_command($cmd)) { + Foo->new->$cmd; + } + elsif ($cmd eq 'cmdlist') { + print join ', ', map { $_->name } Foo->meta->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->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; + } +</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->meta (a class method installed by "use Moose")</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->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->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__->meta->add_attribute(foo => (is => '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 <SPACE> key to go +forward and <BACKSPACE> 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? |