From: Stevan Little Date: Sat, 27 Mar 2010 16:16:53 +0000 (-0400) Subject: starting fresh X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=gitmo%2Fmoose-website.git;a=commitdiff_plain;h=8cde7ffae81d647a04f16d2ffc04069b99352036 starting fresh --- diff --git a/css/style.css b/css/style.css deleted file mode 100644 index ceb0228..0000000 --- a/css/style.css +++ /dev/null @@ -1,79 +0,0 @@ - -BODY { - font-family: Helvetica, Arial; - color: #FFFFFF; - margin: 0px; - font-size: 10pt; -} - -LI { - font-size: 10pt; - width: 80%; -} - -P { - font-size: 10pt; -} - -A { - font-size: 10pt; - color: #FFFFFF; -} - -A:hover { - color: #000000; -} - -#content { - padding-top: 0px; - padding-left: 30px; - padding-right: 20px; -} - -.description { - font-size: 12pt; -} - -.description a { - font-size: 12pt; -} - -.root_list { - list-style: none; - margin-left: -40; - line-height: 2.5em; -} - -.sub_list { - list-style: circle; - margin-left: 0; - line-height: 1em; - display: block; -} - -.list_header { - font-size: 18pt; - font-weight: bold; - color: #FFFFFF; - text-decoration: none; -} - -.list_sub_header { - list-style: none; - font-size: 14pt; - font-weight: bold; - line-height: 1.5em; - color: #FFFFFF; -} - -#line { - height: 1px; - background: #FFFFFF; -} - -.copyright { - font-size: 9pt; - color: #AB9974; - text-align: center; -} - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/Spork.slides b/hosted-presentations/2007/nothingmuch-YAPC-EU/Spork.slides deleted file mode 100644 index ddb86b2..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/Spork.slides +++ /dev/null @@ -1,546 +0,0 @@ ----- -presentation_topic: meta meta meta meta -presentation_title: Object Meta Programming -presentation_place: YAPC::EU::2007 -presentation_date: Aug 29, 2007 ----- -= HAI FRENDS -{image:http://personal.inet.fi/taide/junttila/desert/2002/promopi.jpg} -== My name is Yuval ----- -= Meta Programming -{image: http://www.prints.co.nz/Merchant2/graphics/00000001/7104_Squares_with_Concentric_Circles_Kandinsky_Wassily.jpg} ----- -= Introduction -{image: http://www.room101.net/door.jpg} -+* Meta programming -+* writing /code/ which /outputs/ or /manipulates/ /code/ ----- -= Many forms -{image: http://www.internationalhero.co.uk/m/manimal.jpg} -+* string `eval` -+* `%::` -+* closure generators -+* macros -+* real macros -+* compilers ----- -= Many forms -{image: http://www.junjan.org/weblog/images/Flying_Spaghetti_Monster-thumb.jpg} -+* Home grown snippets -+* Home grown packages -+* Stuff on the CPAN (e.g. `Class::Accessor`, `Code::Perl`) -+* Large systems (`Template::Toolkit`) ----- -= Summary -{image: http://www.evc.org/programs/TD_web_projects/westside_amy_2003_1/teen_times/peerpressure/images/16_peer_pressure_smoking.gif} -* You should already know it -* You probably do it -+* That's the intended audience anyway ;-) ----- -= Object Meta Programming ----- -= Object Meta Programming -+* Code that outputs or manipulates /object oriented code/ -+* Often written in OO ----- -= Simple Examples -{image: http://www.wildoats.com/content/ApplePieSlice.jpg} -+* `Class::Accessor`, `Class::InsideOut` -+** Generates accessor methods -+* `Class::Prototyped` -+** Prototype object support in Perl -+* Lots of stuff on the CPAN ----- -= Modeling OO -{image: http://www.nordicsubs.co.uk/covers/vogue.jpg} -+* High level object meta programming -+** The current trend -+** The picture illustrates an object modelling with class =) -+** Seriously though... ----- -= Modeling OO -{image: http://www.nordicsubs.co.uk/covers/vogue.jpg} -* High level object meta programming -* What is a class? -+.vim -filetype: perl6 - - class Class { - has @isa; - has %methods; - has %attributes; - - ... - } -.vim ----- -= Modeling OO -{image: http://www.nordicsubs.co.uk/covers/vogue.jpg} -+* Implementing OO -+** In OO -+* Meta objects: -+** Class -+** Method -+** Attribute ----- -= Example class - -.vim -filetype: perl6 - - class Point { - has $x; - has $y; - - method distance_to { ... } - } -.vim ----- -= Modeled with objects - -.vim -filetype: perl - - Class->new( - attributes => [ - Attribute->new( name => '$x' ), - Attribute->new( name => '$y' ), - ], - methods => [ - Method->new( - name => "distance_to", - definition => sub { ... } - ), - ], - ); -.vim ----- -= Metamodel Services -{image: http://www1.istockphoto.com/file_thumbview_approve/944779/2/istockphoto_944779_reception_bell.jpg} -+* Form -+** Introspection/Reflection -+* Function -+** Class generation -+** Class transformation -+* Pattern packaging ----- -= Case Study -{image: http://www.iinteractive.com/moose/images/a_moose.gif} -== Moose -+* A deep meta object system -+* 4 layers deep -+** Syntactic sugar -+** Custom metaclasses -+** Class::MOP -+** Perl's native OO ----- -= Perl's native OO -{image: http://www.mileslight.com/images/perl-camel.gif} -+* Minimalistic -+** Class = Package = Symbol table hash -** Inheritence tree embedded in `@ISA` entry -** `bless` links data to a class -** `->` -+* Insanely flexible -+* Pretty klunky -+* Written in C (not very accessible) ----- -= Class::MOP -{image: http://nothingmuch.woobling.org/MOP.jpg} -+* port of CLOS, more or less -+* MOP = Meta Object Protocol ----- -= Class::MOP -{image: http://nothingmuch.woobling.org/MOP.jpg} -+* Model -+** `Class::MOP::Class` -** `Class::MOP::Method` -** `Class::MOP::Attribute` -+* Easy interface -+** Introspection -+** Transformation ----- -= Class::MOP -{image: http://nothingmuch.woobling.org/MOP.jpg} -+* Can "parse" packages into meta objects -+* Modifying the objects writes back to packages -+* Code generation -+** Accessors from attributes -+** Constructor from attributes -+** Method modifiers ----- -= Moose's custom metaclasses -{image: http://www.iinteractive.com/moose/images/a_moose.gif} -+* Subclasses of `Class::MOP::Class` et al -+* More fun features -+** Roles -+** `BUILD` etc a la Perl 6 -+* Type constraints ----- -= Moose sugar layer -{image: http://nothingmuch.woobling.org/sugar.jpg} -+* Pseudo-declarative syntax -+* Maps to metaclass manipulations -+.vim - has foo => ( is => "rw" ); -.vim -+* becomes -+.vim - $metaclass->add_attribute( - Moose::Meta::Attribute->new( - foo => ( is => "rw" ), - ) - ); -.vim ----- -= Moose vs. Class::Accessor -{image: http://nothingmuch.woobling.org/p-seal-at-toronto-zoo.jpg} -+* All that bloat just for the `has` syntax? -+* *NO!* -+* Pattern packaging ----- -= MooseX:: -{image: http://www.threadpit.com/photos/all_styles/small/401.jpg} -+* Packaged meta code -+* Pretty clean -+* Mostly composable ----- -= MooseX:: -{image: http://www.threadpit.com/photos/all_styles/small/401.jpg} -+* `MooseX::Storage` -+** Customizable serialization through metaprogramming -+* `MooseX::AttributeHelpers` -+** Additional methods for collection type attributes -+* `MooseX::Getopt` -+** Additional constructor compiles attributes into a `Getopt` spec -+* `MooseX::IOC` -+** Inversion of control integrated into the object system ----- -= The point of Moose -{image: http://nothingmuch.woobling.org/cute_moose.jpg} -+* OO is less tedious -+* Helps you write meta code -+** Good APIs promote clean code -+** Easier to build on existing base -+** Conventions and structure let you play well with others (`MooseX::`) -+** Introspectable & tranformable metamodel ----- -= Another Case Study -{image: http://www.rockies-ice.com/images/MainHeaderPic_5.gif} -== ORMs -+* Are *HARD* -+* Not even fun like the picture ----- -= ORMs -{image: http://www.agiledata.org/images/legacyDataSources.jpg} -+* Modeling -+** Tables <-> Classes -+** Fields <-> Attributes -+* Code Generation -+** SQL -+** Accessors -+** Relationship fetchers ----- -= `Class::DBI` -+* Meta code is in the base class -+* No clear schema modelling -+* No separation between regular & meta code -+* Lots of hacks -+* Don't go there ----- -= `DBIx::Class` -+* Meta enlightened -+** Schema objects fully model the SQL side -+** ResultSource etc partially model the OO side -+** Components for everything ----- -= `DBIx::Class` -+* Meta code: -+** Proxy objects -+** Accessors -+** Code generation (SQL, Perl) ----- -= ORM related meta programming -+* Complex -+* But manageable ----- -= Vaporware -{image: http://www.nzgeothermal.org.nz/geothermal_energy/images/big/b-silencer-water-vapour.jpg} ----- -= MO -{image: http://www.nzgeothermal.org.nz/geothermal_energy/images/big/b-silencer-water-vapour.jpg} -+* My baby -+* Moose spinoff -+** Stevan says it's Moose 2.0's -+* Perl 5 & Haskell (in pugs) ----- -= MO Sucks -{image: http://www5f.biglobe.ne.jp/~tantan-kids/I.syokuzai/lollypop.jpg} -+* Experimental code -+* Boring parts messy or unwritten -+* Lacking integration, sugar layer -+** mst promised to help ;-) -+* Some parts slow as $*!&% ----- -= MO Rocks -{image: http://nothingmuch.woobling.org/rocks.jpg} -+* Purely functional -+* Very suited for meta transformations -+* Fine grained control over everything -+* Can introduce entirely new conceptions of OO ----- -= MO Architechture -{image: http://www.narrabay.com/images/engineering_large.jpg} -+* Modeling layer -+** Corresponds to compilation -+* Responder layer -+** Corresponds to runtime ----- -= MO Architechture -{image: http://www.narrabay.com/images/engineering_large.jpg} -+* Compiler/sugar layer creates the modeling layer -+** Class objects are constructed, with all the details -+** No meta calculations happen yet -+* Modeling layer is "compiled" into responder layer -+** Can be done on demand or upfront -+* Obscurely named objects -+** Bear with me ----- -= "Concepts" -{image: http://gallery.hd.org/_exhibits/light/_more2003/_more05/light-bulb-glowing-filament-light-blue-uncropped-lores-3-AHD.jpg} -+* The purest form of OO is prototypes -+** prototype OO can implement class OO -+* Concepts are new ways to express objects -+* A class is a concept -+* A role is a concept ----- -= "Responder Interfaces" -{image: http://www.cs.usfca.edu/~parrt/course/652/lectures/images/vtable.jpg} -+* `$ri->dispatch( $responder, $invocation )` -+* Generated from concepts -+* Abstract VTable -+** The flattened method hierarchy -+** ... or something completely different -+** Performance -+** Flexibility ----- -= "Responders" -{image: http://www.maine.gov/spo/flood/images/fema_seal.gif} -+* Something that is the subject of invocations -+** An object instance -+** A class (class methods) -+* A simple tuple `( $data, $ri )` ----- -= "Invocations" -{image: http://www.mobilenews.sk/wp-content/lg-banana.jpg} -+* A method call, multimethod, message... whatever -+** Arguments, too -+* Whatever an RI will put up with -+** Extensible calling semantics ----- -= MO compilation flow -{image: http://www.daveltd.com/photo/rolls/digital/water/waterfalls/snoqualmie-falls/snoqualmie-falls-flowing-3811-equalized.jpg} -+* Instantiate a `Class` object -+** Specify members (methods, attributes) -+** ... and ancestor classes & roles -+* Compile class -+** `my $class_methods_ri = $class->class_interface()` -+** Instance method RI closed in the constructor, within `$ri` -+** Purely functional operation ----- -= RI composition -{image: http://www.daveltd.com/photo/rolls/digital/water/waterfalls/snoqualmie-falls/snoqualmie-falls-flowing-3811-equalized.jpg} -+* Compute instance methods and attributes from ancestry -+* Compute instance slots from attributes -+* Generate accessors -+.vim - MO::Run::ResponderInterface::MethodTable->new( - methods => %methods - ); -.vim -+* Generate constructor -+.vim - sub { - my $data = process_params(@_); - return box( $data, $instance_ri ); - } -.vim ----- -= Instantiation -{image: http://d6044171.u109.worldispnetwork.com/images/Creation-hands-L.jpg} -+* Lookup RI using class name -+* Dispatch constructor class method -+* Compose data from params -+** Slightly complicated -+* Link data with closed `$instance_ri` -+** Responder == ( Data, RI ) -+** Like `bless` ----- -= Method calls -{image: http://www.w3.org/2005/Talks/05-maxf-xtech/telephone.jpg} -+* How to talk with your new object? -+.vim - my $ri = $responder->responder_interface; - - -+ my $method = MO::Run::Invocation::Method->new( - name => "foo" - arguments => \@blah, - ); - - -+ $ri->dispatch( $responder, $method ); -.vim -+* Arbitrary responder interfaces also allowed -+** Doesn't have to be `$responder->responder_interface` ----- -= OH NOES!!! -{image: http://www.encyclopediadramatica.com/images/f/f5/Surprise-buttsecks.jpg} -+* What's wrong with the previous slide? -+* RIs are objects too! -+* Need to bootstrap method calls -+* Runtime must bootstrap low level OO -+** More on this soon ----- -= Meta level polymorphism -{image: http://www.worth1000.com/entries/44500/44790qV87_w.jpg} -+* An important point -+** In fact, *the* point of MO -+* Responder interfaces are polymorphic -+** Method table, network proxy, whatever -+* Easy to specialize -+** Optimizations -+** Strange features -+* Easy to mix several OO systems -+** Just compile to separate RIs ----- -= MO in Perl 5 -{image: http://www.vetaid.org/assets/shop/card-camel-108.jpg} -+* Two runtimes -+* Very different -+* `MO::Run::Aux` wraps both -+** Share tests by running with different `%ENV` var ----- -= Hosted runtime -{image: http://www.philnjill.com/collections/kubricks/kub_alien/S2Secret.jpg} -+* Nested object system -+* Bootstraps with Perl 5 -+** Native Perl OO == Low level, like VM opcodes -+** Virtualized MO == High Level -+** Completely separate levels -+* `$ri->dispatch( $responder, $method )` -+** not `$responder->$method()` -+* Full expressiveness -+* Slow, verbose ----- -= Native runtime -{image: http://www.sonofthesouth.net/american-indians/pictures/indian-camp.jpg} -+* Integrated object system -+* RIs are compiled into packages -+** Simple RIs are dissassembled and stuffed into the stash -+** Complex RIs use `AUTOLOAD`, delegating to the RI meta object -+* Only named method calls -+** No arbitrary call concepts -+** `->` doesn't support anything else -+* As fast as "regular" Perl OO -+** Even makes simple, standalone `.pmc`s ----- -= Perl 5 Runtimes -+* Native -+** Usable with regular Perl OO {html:☺} -+** Lacks arbitrary invocations {html:☹} -+* Virtualized -+** Feature complete {html:☺} -+** Doesn't integrate {html:☹} -+** Slow {html:☹} ----- -= Idealized MO toolchain -{image: http://www.ibiblio.org/wm/paint/auth/botticelli/botticelli.venus.jpg} -+* Compiler handles modeling -+** Constructs meta objects at compile time -+* VM Opcodes support standard RI -+* Custom RIs are just objects -+** Bootstrapped using standard runtime objects -+*** Method table RI -+*** Named method invocation ----- -= Perl 6 -{image: http://lolgeeks.com/wp-content/uploads/2007/05/lolgeeks016.jpg} -+* Perl 6 is the idealized MO toolchain -+** Can introduce syntax -+*** Invocation types -+*** Concept declarations -+** Implement bootstrap RIs in VM opcodes -+* Pugs might be using MO -+** I'm not really sure -+** It was ported a while ago ----- -= Introducing new concepts -+* Roles are the shit -+* But what about next week's fad? -+* MO lets you introduce a new concept -+** Arbitrary at compile time -+** RI protocol at runtime ----- -= Example - Prototype Objects -+* One shared RI -.vim - sub dispatch { - my ( $object, $invocation ) = @_; - - my $method = $object->{ $invocation->name }; - - $object->$method( $invocation->arguments ); - } -.vim ----- -= Example - Attribute Grammars -{image: http://nothingmuch.woobling.org/village_people.jpg} -+* Crazy stuff from the 1970s -+* Renewed interest in {html:λ} land -+* Was pretty easy in MO ----- -= Attribute Grammer Implementation -{image: http://grammar.ccc.commnet.edu/grammar/images/grammar.gif} -+* Introduce new concept objects -+** Attribute Grammar -+** Attribute Grammer Instance - one per AG per class -+* Runtime specialized RI -+** Shadows any RI with additional context sensitive methods -+* Additional runtime support code ----- -= MO TODO -{image: http://www.constructionownerslawblog.com/checklist.jpg} -+* Write a sugar layer -+** Make it fun to use -+* Tests -+* Refactor the Class objects -+** Bloated example code -+** There are some patterns to extract -+* Self hosting ----- -= Self Hosting -+* Easier to maintain MO written in Moose -+* Need to have clean syntax -+* Stable `.pmc` compilation ----- -= Conclusion -{image: http://www1.istockphoto.com/file_thumbview_approve/2540021/2/istockphoto_2540021_painted_exclamation_mark.jpg} -+* Meta code is awesome code -+** Especially my meta code ;-) ----- -= Conclusion -{image: http://www1.istockphoto.com/file_thumbview_approve/2540021/2/istockphoto_2540021_painted_exclamation_mark.jpg} -* Meta code is awesome code -+** Lets you program in new ways -+** Helps you take care of your other code -+* Meta code is important code -+** It can affect *anything* -+** Keep it minimalistic, and clearly defined -+** No spaghetti monsters -+* Meta code can be simple -+** Only complicated if you aren't careful ----- -= BIE FRENDS -{image: http://www.girlscoutsofblackhawk.org/Portals/0/webphotos/thanks.jpg} diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/config.yaml b/hosted-presentations/2007/nothingmuch-YAPC-EU/config.yaml deleted file mode 100644 index 52a1f26..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/config.yaml +++ /dev/null @@ -1,70 +0,0 @@ -################################################################################ -# Spork Configuration File. -# -# Please read this file over and set the values to your own. -# -# If you want global settings for all your slideshows, copy this file to -# ~/.sporkrc/config.yaml. Any settings in this local file will override -# the global value of that setting. -# -# See C for details on settings. -################################################################################ - -# These will be guessed using getpwuid on the real uid - -# author_name: Brian Ingerson -# author_email: ingy@cpan.org -# author_webpage: http://search.cpan.org/~ingy/ -# copyright_string: Copyright © 2005 Brian Ingerson - - - - -# Some styling: - -# banner_bgcolor: hotpink -# logo_image: logo.png -# image_width: 350 -# auto_scrolldown: 1 -# show_controls: 1 -# mouse_controls: 0 -# link_previous: < < Previous -# link_next: Next >> -# link_index: Index - - -# Some paths: - -# slides_file: Spork.slides -# template_directory: template/tt2 -# template_path: -# - ./template/tt2 -# slides_directory: slides - -# This one defaults to CWD, and will vary each time you run 'spork -make' -# file_base: /Users/ingy/dev/cpan/Spork/ - - -# These should probably go in ~/.sporkrc/config.yaml if they're wrong - -# download_method: wget -# start_command: open slides/start.html - -# character_encoding: utf-8 - - - -# Change core classes here: - -# formatter_class: Spork::Formatter::Kwid - - -# Set plugin classes here: - -# plugin_classes: -# - Spork::S5 -# - Spork::S5Theme -# - Spork::S5ThemeFlower -# - Spork::S5ThemeBlackday -# - Kwiki::PerlBlocks - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/config/config.yaml b/hosted-presentations/2007/nothingmuch-YAPC-EU/config/config.yaml deleted file mode 100644 index 059e356..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/config/config.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# DO NOT EDIT THIS FILE -# Put overrides in the top level config.yaml -# See: http://www.kwiki.org/?ChangingConfigDotYaml -# -site_title: Kwiki -main_page: HomePage -database_directory: database -logo_image: palm90.png -script_name: index.cgi diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/pretty.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/pretty.css deleted file mode 100644 index 5db43b7..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/pretty.css +++ /dev/null @@ -1,48 +0,0 @@ -/* - Theme: i18n - Eric A. Meyer (http://meyerweb.com/) - Theme placed under CC by-sa 2.0 license -*/ - -body {background: #95A7D4 url(bg-slide.jpg) 100% 100% no-repeat; color: #210; font: 36px Arial, sans-serif; line-height: .9;} -a {text-decoration: none; color: #336; border-bottom: 1px dotted;} -h1, h2, h3, h4, h5, h6 {font-size: 1.3em; margin: 0 2em;} -sup {font-size: 0.75em; font-weight: normal; - vertical-align: 0.5em; line-height: 1px;} -ul {margin-left: 1em; padding-left: 0; font-size: } -li {margin-bottom: 0.66em;} -li li {margin: 0.33em 0; font-size: smaller;} - -#header {background: url(bg-shade.png); border-bottom: 1px solid #333; - padding-bottom: 2em;} -#footer {background: url(bg-shade.png); color: #BBB; border-top: 1px solid #333;} -#header, #footer {font-size: 0.5em;} -#footer h1, #footer h2 { padding: 0.5em 0.75em; - font-weight: normal; font-style: italic;} -#footer h1 {left: 0; font-size: 1em; letter-spacing: 1px;} -#footer h2 {position: absolute; bottom: 0; right: 0;} - -#controls {font-size: 0.75em;} -#navList {margin-top: 3px;} -#navLinks a {margin: 0 0.33em; padding: 0 0.25em; - border: 1px solid; border-color: #CCD #556 #556 #CCD; - background-color: #8597C4;} - -#currentSlide {font-size: 0.5em;} -#currentSlide span {font-size: 13px; color: rgb(49%,47%,66%);} -#currentSlide #csSep {display: none;} -#currentSlide #csHere {font-weight: bold;} -#currentSlide #csHere:before {content: "#"; font-weight: normal;} -#currentSlide #csTotal:before {content: " of ";} - -.slide h1 {font-size: 2em; line-height: 1; letter-spacing: -1px; font-weight: +100%; - margin: 0 -15% 1em 0; padding: 0.5em 15% 0.06125em 0; border-bottom: 0.06125em solid rgb(90,94,120);} -#slide0 h1 {border: none; font-size: 2em; letter-spacing: 0; margin: 3em 0 1.5em;} -#slide0 h2 {font-size: 1em; margin: 0.5em 0 0;} -#slide0 h3 {font-size: 1em; margin: 0.5em 0 0;} -#slide0 h4 {margin-top: 0; font-size: smaller;} - -small { display: none }; - -.slide .current {color: #003; text-shadow: 0 0 0.25em #9AABD7;} - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/css/vim_mode.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/css/vim_mode.css deleted file mode 100644 index a7ba2e3..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/css/vim_mode.css +++ /dev/null @@ -1,11 +0,0 @@ -pre.vim { margin-left: 1em } -.synComment { color: #0000FF } -.synConstant { color: #FF00FF } -.synIdentifier { color: #008B8B } -.synStatement { color: #A52A2A ; font-weight: bold } -.synPreProc { color: #A020F0 } -.synType { color: #2E8B57 ; font-weight: bold } -.synSpecial { color: #6A5ACD } -.synUnderlined { color: #000000 ; text-decoration: underline } -.synError { color: #FFFFFF ; background: #FF0000 none } -.synTodo { color: #0000FF ; background: #FFFF00 none } diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/16_peer_pressure_smoking.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/16_peer_pressure_smoking.gif deleted file mode 100644 index 4c30c8c..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/16_peer_pressure_smoking.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/2.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/2.jpg deleted file mode 100644 index fb4991e..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/2.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/401.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/401.jpg deleted file mode 100644 index a641d9e..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/401.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/44790qV87_w.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/44790qV87_w.jpg deleted file mode 100644 index 6ef2533..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/44790qV87_w.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/7104_Squares_with_Concentric_Circles_Kandinsky_Wassily.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/7104_Squares_with_Concentric_Circles_Kandinsky_Wassily.jpg deleted file mode 100644 index f90a214..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/7104_Squares_with_Concentric_Circles_Kandinsky_Wassily.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/ApplePieSlice.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/ApplePieSlice.jpg deleted file mode 100644 index e52872c..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/ApplePieSlice.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blacksmith.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blacksmith.jpg deleted file mode 100644 index 28ad0e8..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blacksmith.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blog.Ubuntu5.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blog.Ubuntu5.jpg deleted file mode 100644 index 6b6cbdd..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Blog.Ubuntu5.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Creation-hands-L.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Creation-hands-L.jpg deleted file mode 100644 index 0cd9e1f..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Creation-hands-L.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/FLDancers03.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/FLDancers03.jpg deleted file mode 100644 index f114bd1..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/FLDancers03.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Flying_Spaghetti_Monster-thumb.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Flying_Spaghetti_Monster-thumb.jpg deleted file mode 100644 index ad18867..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Flying_Spaghetti_Monster-thumb.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/JulieMomBOM.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/JulieMomBOM.jpg deleted file mode 100644 index 519e6cd..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/JulieMomBOM.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/LDL-1000_012.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/LDL-1000_012.jpg deleted file mode 100644 index 5443a6a..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/LDL-1000_012.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MOP.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MOP.jpg deleted file mode 100644 index 5fdcddd..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MOP.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MainHeaderPic_5.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MainHeaderPic_5.gif deleted file mode 100644 index 921567b..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/MainHeaderPic_5.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Moibeal-Mop-Detail.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Moibeal-Mop-Detail.jpg deleted file mode 100644 index d198659..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Moibeal-Mop-Detail.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/S2Secret.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/S2Secret.jpg deleted file mode 100644 index ed8b351..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/S2Secret.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Surprise-buttsecks.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Surprise-buttsecks.jpg deleted file mode 100644 index 79ca860..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Surprise-buttsecks.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Sweden-coins-10-5-Kronor-50-oere-silver-copper-gold-colours-SEK-1-DHD.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Sweden-coins-10-5-Kronor-50-oere-silver-copper-gold-colours-SEK-1-DHD.jpg deleted file mode 100644 index 821d476..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Sweden-coins-10-5-Kronor-50-oere-silver-copper-gold-colours-SEK-1-DHD.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Thank b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Thank deleted file mode 100644 index 07eae5c..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/Thank +++ /dev/null @@ -1,24 +0,0 @@ - - - Not yet in... - - -

Go away, come back later.

- - -
- - -
- - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/a_moose.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/a_moose.gif deleted file mode 100644 index d3e67b2..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/a_moose.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/b-silencer-water-vapour.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/b-silencer-water-vapour.jpg deleted file mode 100644 index 400e3e0..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/b-silencer-water-vapour.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bagdad_bob_large.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bagdad_bob_large.gif deleted file mode 100644 index e3a3f6e..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bagdad_bob_large.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/basics.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/basics.jpg deleted file mode 100644 index 33524d6..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/basics.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bcg_fresh_fruits_1024x768.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bcg_fresh_fruits_1024x768.jpg deleted file mode 100644 index dbec8f7..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/bcg_fresh_fruits_1024x768.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/botticelli.venus.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/botticelli.venus.jpg deleted file mode 100644 index a9171b8..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/botticelli.venus.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/burger.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/burger.jpg deleted file mode 100644 index d7b5ff2..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/burger.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/card-camel-108.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/card-camel-108.jpg deleted file mode 100644 index 8b5ad3a..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/card-camel-108.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/centralized_decentralized.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/centralized_decentralized.gif deleted file mode 100644 index 72a0298..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/centralized_decentralized.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/checklist.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/checklist.jpg deleted file mode 100644 index ba3d214..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/checklist.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cherries.png b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cherries.png deleted file mode 100644 index d806914..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cherries.png and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/colorpref.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/colorpref.gif deleted file mode 100644 index 0cf8915..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/colorpref.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/concepts-bicycleObject.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/concepts-bicycleObject.gif deleted file mode 100644 index f7f37f1..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/concepts-bicycleObject.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/conflict-1.1.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/conflict-1.1.gif deleted file mode 100644 index 2975797..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/conflict-1.1.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cpan.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cpan.jpg deleted file mode 100644 index 2b98e13..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cpan.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cute_moose.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cute_moose.jpg deleted file mode 100644 index db9a4f2..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/cute_moose.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/dependencies.png b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/dependencies.png deleted file mode 100644 index 4606a95..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/dependencies.png and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/desk.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/desk.jpg deleted file mode 100644 index 8d52ee1..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/desk.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/door.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/door.jpg deleted file mode 100644 index d1ba86b..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/door.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/email_final.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/email_final.jpg deleted file mode 100644 index df6cbcd..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/email_final.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/engineering_large.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/engineering_large.jpg deleted file mode 100644 index dd3430c..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/engineering_large.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/fema_seal.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/fema_seal.gif deleted file mode 100644 index b314260..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/fema_seal.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/friend16.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/friend16.jpg deleted file mode 100644 index 36cb7c0..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/friend16.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant deleted file mode 100644 index 07eae5c..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant +++ /dev/null @@ -1,24 +0,0 @@ - - - Not yet in... - - -

Go away, come back later.

- - -
- - -
- - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant_cake.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant_cake.jpg deleted file mode 100644 index cd55e77..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/giant_cake.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/grammar.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/grammar.gif deleted file mode 100644 index 971fe3c..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/grammar.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/img19.png b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/img19.png deleted file mode 100644 index 6667982..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/img19.png and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/indian-camp.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/indian-camp.jpg deleted file mode 100644 index da05814..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/indian-camp.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_2540021_painted_exclamation_mark.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_2540021_painted_exclamation_mark.jpg deleted file mode 100644 index 945cc4b..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_2540021_painted_exclamation_mark.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_944779_reception_bell.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_944779_reception_bell.jpg deleted file mode 100644 index fd96479..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/istockphoto_944779_reception_bell.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/kyle-needs-help-2.half.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/kyle-needs-help-2.half.jpg deleted file mode 100644 index 16ba1c4..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/kyle-needs-help-2.half.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/large_logo.png b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/large_logo.png deleted file mode 100644 index 7e4773c..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/large_logo.png and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/legacyDataSources.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/legacyDataSources.jpg deleted file mode 100644 index 08b3061..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/legacyDataSources.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lg-banana.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lg-banana.jpg deleted file mode 100644 index 9df9eb5..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lg-banana.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/light-bulb-glowing-filament-light-blue-uncropped-lores-3-AHD.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/light-bulb-glowing-filament-light-blue-uncropped-lores-3-AHD.jpg deleted file mode 100644 index 8d976ff..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/light-bulb-glowing-filament-light-blue-uncropped-lores-3-AHD.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lolgeeks016.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lolgeeks016.jpg deleted file mode 100644 index f3c14a2..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lolgeeks016.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lollypop.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lollypop.jpg deleted file mode 100644 index 38e1d1e..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/lollypop.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mag_glass.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mag_glass.jpg deleted file mode 100644 index 19eeda1..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mag_glass.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/maintop.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/maintop.jpg deleted file mode 100644 index ba801a9..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/maintop.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/manimal.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/manimal.jpg deleted file mode 100644 index e7818b0..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/manimal.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/microphone.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/microphone.jpg deleted file mode 100644 index 0d8b99b..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/microphone.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/moose3sm.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/moose3sm.jpg deleted file mode 100644 index b363f0a..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/moose3sm.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mushroomcloud-37024.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mushroomcloud-37024.jpg deleted file mode 100644 index e08601b..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/mushroomcloud-37024.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p-seal-at-toronto-zoo.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p-seal-at-toronto-zoo.jpg deleted file mode 100644 index fd504ed..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p-seal-at-toronto-zoo.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p4v_revision_graph_6.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p4v_revision_graph_6.gif deleted file mode 100644 index ee5ba65..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/p4v_revision_graph_6.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl-camel.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl-camel.gif deleted file mode 100644 index 1c90410..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl-camel.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl6book-parody.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl6book-parody.gif deleted file mode 100644 index e6a8f59..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/perl6book-parody.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/promopi.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/promopi.jpg deleted file mode 100644 index 5260d15..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/promopi.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/rocks.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/rocks.jpg deleted file mode 100644 index cf7e52f..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/rocks.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/snoqualmie-falls-flowing-3811-equalized.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/snoqualmie-falls-flowing-3811-equalized.jpg deleted file mode 100644 index e9db203..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/snoqualmie-falls-flowing-3811-equalized.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/sugar.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/sugar.jpg deleted file mode 100644 index 20c10e9..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/sugar.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/telephone.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/telephone.jpg deleted file mode 100644 index 5b55622..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/telephone.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/thanks.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/thanks.jpg deleted file mode 100644 index 04f78d4..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/thanks.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/tip.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/tip.gif deleted file mode 100644 index 01d9b8e..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/tip.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/trashcanc.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/trashcanc.gif deleted file mode 100644 index a66a994..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/trashcanc.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/village_people.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/village_people.jpg deleted file mode 100644 index 956a60a..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/village_people.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vogue.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vogue.jpg deleted file mode 100644 index 6ad1211..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vogue.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vtable.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vtable.jpg deleted file mode 100644 index 19f42e4..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/images/vtable.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/start.html b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/start.html deleted file mode 100644 index c55532f..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/start.html +++ /dev/null @@ -1,6535 +0,0 @@ - - - - - -meta meta meta meta - - - - - - - - - - - -
-
- - -
- -
-

Object Meta Programming

-

YAPC::EU::2007

-

Aug 29, 2007

-
- - - -
- -

HAI FRENDS

-

- -

-

My name is Yuval

- -
- - - - -
- -

Meta Programming

-

- -

- -
- - - - -
- -

Introduction

-

- -

-continued... - -
- - - - -
- -

Introduction

-

- -

-
    -
  • Meta programming
  • -
-continued... - -
- - - - -
- -

Introduction

-

- -

-
    -
  • Meta programming
  • -
  • writing code which outputs or manipulates code
  • -
- -
- - - - -
- -

Many forms

-

- -

-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
  • %::
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
  • %::
  • -
  • closure generators
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
  • %::
  • -
  • closure generators
  • -
  • macros
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
  • %::
  • -
  • closure generators
  • -
  • macros
  • -
  • real macros
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • string eval
  • -
  • %::
  • -
  • closure generators
  • -
  • macros
  • -
  • real macros
  • -
  • compilers
  • -
- -
- - - - -
- -

Many forms

-

- -

-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • Home grown snippets
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • Home grown snippets
  • -
  • Home grown packages
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • Home grown snippets
  • -
  • Home grown packages
  • -
  • Stuff on the CPAN (e.g. Class::Accessor, Code::Perl)
  • -
-continued... - -
- - - - -
- -

Many forms

-

- -

-
    -
  • Home grown snippets
  • -
  • Home grown packages
  • -
  • Stuff on the CPAN (e.g. Class::Accessor, Code::Perl)
  • -
  • Large systems (Template::Toolkit)
  • -
- -
- - - - -
- -

Summary

-

- -

-
    -
  • You should already know it
  • -
  • You probably do it
  • -
-continued... - -
- - - - -
- -

Summary

-

- -

-
    -
  • You should already know it
  • -
  • You probably do it
  • -
  • That's the intended audience anyway ;-)
  • -
- -
- - - - -
- -

Object Meta Programming

- -
- - - - -
- -

Object Meta Programming

-continued... - -
- - - - -
- -

Object Meta Programming

-
    -
  • Code that outputs or manipulates object oriented code
  • -
-continued... - -
- - - - -
- -

Object Meta Programming

-
    -
  • Code that outputs or manipulates object oriented code
  • -
  • Often written in OO
  • -
- -
- - - - -
- -

Simple Examples

-

- -

-continued... - -
- - - - -
- -

Simple Examples

-

- -

-
    -
  • Class::Accessor, Class::InsideOut
  • -
-continued... - -
- - - - -
- -

Simple Examples

-

- -

-
    -
  • Class::Accessor, Class::InsideOut
  • - -
      -
    • Generates accessor methods
    • -
-continued... - -
- - - - -
- -

Simple Examples

-

- -

-
    -
  • Class::Accessor, Class::InsideOut
  • - -
      -
    • Generates accessor methods
    • -
    -
  • Class::Prototyped
  • -
-continued... - -
- - - - -
- -

Simple Examples

-

- -

-
    -
  • Class::Accessor, Class::InsideOut
  • - -
      -
    • Generates accessor methods
    • -
    -
  • Class::Prototyped
  • - -
      -
    • Prototype object support in Perl
    • -
-continued... - -
- - - - -
- -

Simple Examples

-

- -

-
    -
  • Class::Accessor, Class::InsideOut
  • - -
      -
    • Generates accessor methods
    • -
    -
  • Class::Prototyped
  • - -
      -
    • Prototype object support in Perl
    • -
    -
  • Lots of stuff on the CPAN
  • -
- -
- - - - -
- -

Modeling OO

-

- -

-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • - -
      -
    • The current trend
    • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • - -
      -
    • The current trend
    • -
    • The picture illustrates an object modelling with class =)
    • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • - -
      -
    • The current trend
    • -
    • The picture illustrates an object modelling with class =)
    • -
    • Seriously though...
    • -
- -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • -
  • What is a class?
  • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • High level object meta programming
  • -
  • What is a class?
  • -
-
  class Class {
-    has @isa;
-    has %methods;
-    has %attributes;
-
-    ...
-  }
-
- -
- - - - -
- -

Modeling OO

-

- -

-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • - -
      -
    • In OO
    • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • - -
      -
    • In OO
    • -
    -
  • Meta objects:
  • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • - -
      -
    • In OO
    • -
    -
  • Meta objects:
  • - -
      -
    • Class
    • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • - -
      -
    • In OO
    • -
    -
  • Meta objects:
  • - -
      -
    • Class
    • -
    • Method
    • -
-continued... - -
- - - - -
- -

Modeling OO

-

- -

-
    -
  • Implementing OO
  • - -
      -
    • In OO
    • -
    -
  • Meta objects:
  • - -
      -
    • Class
    • -
    • Method
    • -
    • Attribute
    • -
- -
- - - - -
- -

Example class

-
  class Point {
-    has $x;
-    has $y;
-
-    method distance_to { ... }
-  }
-
- -
- - - - -
- -

Modeled with objects

-
  Class->new(
-    attributes => [
-      Attribute->new( name => '$x' ),
-      Attribute->new( name => '$y' ),
-    ],
-    methods => [
-      Method->new(
-        name       => "distance_to",
-        definition => sub { ... }
-      ),
-    ],
-  );
-
- -
- - - - -
- -

Metamodel Services

-

- -

-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • -
-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • - -
      -
    • Introspection/Reflection
    • -
-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • - -
      -
    • Introspection/Reflection
    • -
    -
  • Function
  • -
-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • - -
      -
    • Introspection/Reflection
    • -
    -
  • Function
  • - -
      -
    • Class generation
    • -
-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • - -
      -
    • Introspection/Reflection
    • -
    -
  • Function
  • - -
      -
    • Class generation
    • -
    • Class transformation
    • -
-continued... - -
- - - - -
- -

Metamodel Services

-

- -

-
    -
  • Form
  • - -
      -
    • Introspection/Reflection
    • -
    -
  • Function
  • - -
      -
    • Class generation
    • -
    • Class transformation
    • -
    -
  • Pattern packaging
  • -
- -
- - - - -
- -

Case Study

-

- -

-

Moose

-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
  • 4 layers deep
  • -
-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
  • 4 layers deep
  • - -
      -
    • Syntactic sugar
    • -
-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
  • 4 layers deep
  • - -
      -
    • Syntactic sugar
    • -
    • Custom metaclasses
    • -
-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
  • 4 layers deep
  • - -
      -
    • Syntactic sugar
    • -
    • Custom metaclasses
    • -
    • Class::MOP
    • -
-continued... - -
- - - - -
- -

Case Study

-

- -

-

Moose

-
    -
  • A deep meta object system
  • -
  • 4 layers deep
  • - -
      -
    • Syntactic sugar
    • -
    • Custom metaclasses
    • -
    • Class::MOP
    • -
    • Perl's native OO
    • -
- -
- - - - -
- -

Perl's native OO

-

- -

-continued... - -
- - - - -
- -

Perl's native OO

-

- -

-
    -
  • Minimalistic
  • -
-continued... - -
- - - - -
- -

Perl's native OO

-

- -

-
    -
  • Minimalistic
  • - -
      -
    • Class = Package = Symbol table hash
    • -
    • Inheritence tree embedded in @ISA entry
    • -
    • bless links data to a class
    • -
    • ->
    • -
-continued... - -
- - - - -
- -

Perl's native OO

-

- -

-
    -
  • Minimalistic
  • - -
      -
    • Class = Package = Symbol table hash
    • -
    • Inheritence tree embedded in @ISA entry
    • -
    • bless links data to a class
    • -
    • ->
    • -
    -
  • Insanely flexible
  • -
-continued... - -
- - - - -
- -

Perl's native OO

-

- -

-
    -
  • Minimalistic
  • - -
      -
    • Class = Package = Symbol table hash
    • -
    • Inheritence tree embedded in @ISA entry
    • -
    • bless links data to a class
    • -
    • ->
    • -
    -
  • Insanely flexible
  • -
  • Pretty klunky
  • -
-continued... - -
- - - - -
- -

Perl's native OO

-

- -

-
    -
  • Minimalistic
  • - -
      -
    • Class = Package = Symbol table hash
    • -
    • Inheritence tree embedded in @ISA entry
    • -
    • bless links data to a class
    • -
    • ->
    • -
    -
  • Insanely flexible
  • -
  • Pretty klunky
  • -
  • Written in C (not very accessible)
  • -
- -
- - - - -
- -

Class::MOP

-

- -

-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • port of CLOS, more or less
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • port of CLOS, more or less
  • -
  • MOP = Meta Object Protocol
  • -
- -
- - - - -
- -

Class::MOP

-

- -

-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Model
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Model
  • - -
      -
    • Class::MOP::Class
    • -
    • Class::MOP::Method
    • -
    • Class::MOP::Attribute
    • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Model
  • - -
      -
    • Class::MOP::Class
    • -
    • Class::MOP::Method
    • -
    • Class::MOP::Attribute
    • -
    -
  • Easy interface
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Model
  • - -
      -
    • Class::MOP::Class
    • -
    • Class::MOP::Method
    • -
    • Class::MOP::Attribute
    • -
    -
  • Easy interface
  • - -
      -
    • Introspection
    • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Model
  • - -
      -
    • Class::MOP::Class
    • -
    • Class::MOP::Method
    • -
    • Class::MOP::Attribute
    • -
    -
  • Easy interface
  • - -
      -
    • Introspection
    • -
    • Transformation
    • -
- -
- - - - -
- -

Class::MOP

-

- -

-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
  • Modifying the objects writes back to packages
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
  • Modifying the objects writes back to packages
  • -
  • Code generation
  • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
  • Modifying the objects writes back to packages
  • -
  • Code generation
  • - -
      -
    • Accessors from attributes
    • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
  • Modifying the objects writes back to packages
  • -
  • Code generation
  • - -
      -
    • Accessors from attributes
    • -
    • Constructor from attributes
    • -
-continued... - -
- - - - -
- -

Class::MOP

-

- -

-
    -
  • Can "parse" packages into meta objects
  • -
  • Modifying the objects writes back to packages
  • -
  • Code generation
  • - -
      -
    • Accessors from attributes
    • -
    • Constructor from attributes
    • -
    • Method modifiers
    • -
- -
- - - - -
- -

Moose's custom metaclasses

-

- -

-continued... - -
- - - - -
- -

Moose's custom metaclasses

-

- -

-
    -
  • Subclasses of Class::MOP::Class et al
  • -
-continued... - -
- - - - -
- -

Moose's custom metaclasses

-

- -

-
    -
  • Subclasses of Class::MOP::Class et al
  • -
  • More fun features
  • -
-continued... - -
- - - - -
- -

Moose's custom metaclasses

-

- -

-
    -
  • Subclasses of Class::MOP::Class et al
  • -
  • More fun features
  • - -
      -
    • Roles
    • -
-continued... - -
- - - - -
- -

Moose's custom metaclasses

-

- -

-
    -
  • Subclasses of Class::MOP::Class et al
  • -
  • More fun features
  • - -
      -
    • Roles
    • -
    • BUILD etc a la Perl 6
    • -
-continued... - -
- - - - -
- -

Moose's custom metaclasses

-

- -

-
    -
  • Subclasses of Class::MOP::Class et al
  • -
  • More fun features
  • - -
      -
    • Roles
    • -
    • BUILD etc a la Perl 6
    • -
    -
  • Type constraints
  • -
- -
- - - - -
- -

Moose sugar layer

-

- -

-continued... - -
- - - - -
- -

Moose sugar layer

-

- -

-
    -
  • Pseudo-declarative syntax
  • -
-continued... - -
- - - - -
- -

Moose sugar layer

-

- -

-
    -
  • Pseudo-declarative syntax
  • -
  • Maps to metaclass manipulations
  • -
-continued... - -
- - - - -
- -

Moose sugar layer

-

- -

-
    -
  • Pseudo-declarative syntax
  • -
  • Maps to metaclass manipulations
  • -
-
  has foo => ( is => "rw" );
-
-continued... - -
- - - - -
- -

Moose sugar layer

-

- -

-
    -
  • Pseudo-declarative syntax
  • -
  • Maps to metaclass manipulations
  • -
-
  has foo => ( is => "rw" );
-
-
    -
  • becomes
  • -
-continued... - -
- - - - -
- -

Moose sugar layer

-

- -

-
    -
  • Pseudo-declarative syntax
  • -
  • Maps to metaclass manipulations
  • -
-
  has foo => ( is => "rw" );
-
-
    -
  • becomes
  • -
-
  $metaclass->add_attribute(
-    Moose::Meta::Attribute->new(
-      foo => ( is => "rw" ),
-    )
-  );
-
- -
- - - - -
- -

Moose vs. Class::Accessor

-

- -

-continued... - -
- - - - -
- -

Moose vs. Class::Accessor

-

- -

-
    -
  • All that bloat just for the has syntax?
  • -
-continued... - -
- - - - -
- -

Moose vs. Class::Accessor

-

- -

-
    -
  • All that bloat just for the has syntax?
  • -
  • NO!
  • -
-continued... - -
- - - - -
- -

Moose vs. Class::Accessor

-

- -

-
    -
  • All that bloat just for the has syntax?
  • -
  • NO!
  • -
  • Pattern packaging
  • -
- -
- - - - -
- -

MooseX::

-

- -

-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • Packaged meta code
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • Packaged meta code
  • -
  • Pretty clean
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • Packaged meta code
  • -
  • Pretty clean
  • -
  • Mostly composable
  • -
- -
- - - - -
- -

MooseX::

-

- -

-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • - -
      -
    • Additional methods for collection type attributes
    • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • - -
      -
    • Additional methods for collection type attributes
    • -
    -
  • MooseX::Getopt
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • - -
      -
    • Additional methods for collection type attributes
    • -
    -
  • MooseX::Getopt
  • - -
      -
    • Additional constructor compiles attributes into a Getopt spec
    • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • - -
      -
    • Additional methods for collection type attributes
    • -
    -
  • MooseX::Getopt
  • - -
      -
    • Additional constructor compiles attributes into a Getopt spec
    • -
    -
  • MooseX::IOC
  • -
-continued... - -
- - - - -
- -

MooseX::

-

- -

-
    -
  • MooseX::Storage
  • - -
      -
    • Customizable serialization through metaprogramming
    • -
    -
  • MooseX::AttributeHelpers
  • - -
      -
    • Additional methods for collection type attributes
    • -
    -
  • MooseX::Getopt
  • - -
      -
    • Additional constructor compiles attributes into a Getopt spec
    • -
    -
  • MooseX::IOC
  • - -
      -
    • Inversion of control integrated into the object system
    • -
- -
- - - - -
- -

The point of Moose

-

- -

-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
  • Helps you write meta code
  • -
-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
  • Helps you write meta code
  • - -
      -
    • Good APIs promote clean code
    • -
-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
  • Helps you write meta code
  • - -
      -
    • Good APIs promote clean code
    • -
    • Easier to build on existing base
    • -
-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
  • Helps you write meta code
  • - -
      -
    • Good APIs promote clean code
    • -
    • Easier to build on existing base
    • -
    • Conventions and structure let you play well with others (MooseX::)
    • -
-continued... - -
- - - - -
- -

The point of Moose

-

- -

-
    -
  • OO is less tedious
  • -
  • Helps you write meta code
  • - -
      -
    • Good APIs promote clean code
    • -
    • Easier to build on existing base
    • -
    • Conventions and structure let you play well with others (MooseX::)
    • -
    • Introspectable & tranformable metamodel
    • -
- -
- - - - -
- -

Another Case Study

-

- -

-

ORMs

-continued... - -
- - - - -
- -

Another Case Study

-

- -

-

ORMs

-
    -
  • Are HARD
  • -
-continued... - -
- - - - -
- -

Another Case Study

-

- -

-

ORMs

-
    -
  • Are HARD
  • -
  • Not even fun like the picture
  • -
- -
- - - - -
- -

ORMs

-

- -

-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
    • Fields <-> Attributes
    • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
    • Fields <-> Attributes
    • -
    -
  • Code Generation
  • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
    • Fields <-> Attributes
    • -
    -
  • Code Generation
  • - -
      -
    • SQL
    • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
    • Fields <-> Attributes
    • -
    -
  • Code Generation
  • - -
      -
    • SQL
    • -
    • Accessors
    • -
-continued... - -
- - - - -
- -

ORMs

-

- -

-
    -
  • Modeling
  • - -
      -
    • Tables <-> Classes
    • -
    • Fields <-> Attributes
    • -
    -
  • Code Generation
  • - -
      -
    • SQL
    • -
    • Accessors
    • -
    • Relationship fetchers
    • -
- -
- - - - -
- -

Class::DBI

-continued... - -
- - - - -
- -

Class::DBI

-
    -
  • Meta code is in the base class
  • -
-continued... - -
- - - - -
- -

Class::DBI

-
    -
  • Meta code is in the base class
  • -
  • No clear schema modelling
  • -
-continued... - -
- - - - -
- -

Class::DBI

-
    -
  • Meta code is in the base class
  • -
  • No clear schema modelling
  • -
  • No separation between regular & meta code
  • -
-continued... - -
- - - - -
- -

Class::DBI

-
    -
  • Meta code is in the base class
  • -
  • No clear schema modelling
  • -
  • No separation between regular & meta code
  • -
  • Lots of hacks
  • -
-continued... - -
- - - - -
- -

Class::DBI

-
    -
  • Meta code is in the base class
  • -
  • No clear schema modelling
  • -
  • No separation between regular & meta code
  • -
  • Lots of hacks
  • -
  • Don't go there
  • -
- -
- - - - -
- -

DBIx::Class

-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta enlightened
  • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta enlightened
  • - -
      -
    • Schema objects fully model the SQL side
    • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta enlightened
  • - -
      -
    • Schema objects fully model the SQL side
    • -
    • ResultSource etc partially model the OO side
    • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta enlightened
  • - -
      -
    • Schema objects fully model the SQL side
    • -
    • ResultSource etc partially model the OO side
    • -
    • Components for everything
    • -
- -
- - - - -
- -

DBIx::Class

-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta code:
  • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta code:
  • - -
      -
    • Proxy objects
    • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta code:
  • - -
      -
    • Proxy objects
    • -
    • Accessors
    • -
-continued... - -
- - - - -
- -

DBIx::Class

-
    -
  • Meta code:
  • - -
      -
    • Proxy objects
    • -
    • Accessors
    • -
    • Code generation (SQL, Perl)
    • -
- -
- - - - -
- -

ORM related meta programming

-continued... - -
- - - - -
- -

ORM related meta programming

-
    -
  • Complex
  • -
-continued... - -
- - - - -
- -

ORM related meta programming

-
    -
  • Complex
  • -
  • But manageable
  • -
- -
- - - - -
- -

Vaporware

-

- -

- -
- - - - -
- -

MO

-

- -

-continued... - -
- - - - -
- -

MO

-

- -

-
    -
  • My baby
  • -
-continued... - -
- - - - -
- -

MO

-

- -

-
    -
  • My baby
  • -
  • Moose spinoff
  • -
-continued... - -
- - - - -
- -

MO

-

- -

-
    -
  • My baby
  • -
  • Moose spinoff
  • - -
      -
    • Stevan says it's Moose 2.0's
    • -
-continued... - -
- - - - -
- -

MO

-

- -

-
    -
  • My baby
  • -
  • Moose spinoff
  • - -
      -
    • Stevan says it's Moose 2.0's
    • -
    -
  • Perl 5 & Haskell (in pugs)
  • -
- -
- - - - -
- -

MO Sucks

-

- -

-continued... - -
- - - - -
- -

MO Sucks

-

- -

-
    -
  • Experimental code
  • -
-continued... - -
- - - - -
- -

MO Sucks

-

- -

-
    -
  • Experimental code
  • -
  • Boring parts messy or unwritten
  • -
-continued... - -
- - - - -
- -

MO Sucks

-

- -

-
    -
  • Experimental code
  • -
  • Boring parts messy or unwritten
  • -
  • Lacking integration, sugar layer
  • -
-continued... - -
- - - - -
- -

MO Sucks

-

- -

-
    -
  • Experimental code
  • -
  • Boring parts messy or unwritten
  • -
  • Lacking integration, sugar layer
  • - -
      -
    • mst promised to help ;-)
    • -
-continued... - -
- - - - -
- -

MO Sucks

-

- -

-
    -
  • Experimental code
  • -
  • Boring parts messy or unwritten
  • -
  • Lacking integration, sugar layer
  • - -
      -
    • mst promised to help ;-)
    • -
    -
  • Some parts slow as $*!&%
  • -
- -
- - - - -
- -

MO Rocks

-

- -

-continued... - -
- - - - -
- -

MO Rocks

-

- -

-
    -
  • Purely functional
  • -
-continued... - -
- - - - -
- -

MO Rocks

-

- -

-
    -
  • Purely functional
  • -
  • Very suited for meta transformations
  • -
-continued... - -
- - - - -
- -

MO Rocks

-

- -

-
    -
  • Purely functional
  • -
  • Very suited for meta transformations
  • -
  • Fine grained control over everything
  • -
-continued... - -
- - - - -
- -

MO Rocks

-

- -

-
    -
  • Purely functional
  • -
  • Very suited for meta transformations
  • -
  • Fine grained control over everything
  • -
  • Can introduce entirely new conceptions of OO
  • -
- -
- - - - -
- -

MO Architechture

-

- -

-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Modeling layer
  • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Modeling layer
  • - -
      -
    • Corresponds to compilation
    • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Modeling layer
  • - -
      -
    • Corresponds to compilation
    • -
    -
  • Responder layer
  • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Modeling layer
  • - -
      -
    • Corresponds to compilation
    • -
    -
  • Responder layer
  • - -
      -
    • Corresponds to runtime
    • -
- -
- - - - -
- -

MO Architechture

-

- -

-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
    • No meta calculations happen yet
    • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
    • No meta calculations happen yet
    • -
    -
  • Modeling layer is "compiled" into responder layer
  • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
    • No meta calculations happen yet
    • -
    -
  • Modeling layer is "compiled" into responder layer
  • - -
      -
    • Can be done on demand or upfront
    • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
    • No meta calculations happen yet
    • -
    -
  • Modeling layer is "compiled" into responder layer
  • - -
      -
    • Can be done on demand or upfront
    • -
    -
  • Obscurely named objects
  • -
-continued... - -
- - - - -
- -

MO Architechture

-

- -

-
    -
  • Compiler/sugar layer creates the modeling layer
  • - -
      -
    • Class objects are constructed, with all the details
    • -
    • No meta calculations happen yet
    • -
    -
  • Modeling layer is "compiled" into responder layer
  • - -
      -
    • Can be done on demand or upfront
    • -
    -
  • Obscurely named objects
  • - -
      -
    • Bear with me
    • -
- -
- - - - -
- -

"Concepts"

-

- -

-continued... - -
- - - - -
- -

"Concepts"

-

- -

-
    -
  • The purest form of OO is prototypes
  • -
-continued... - -
- - - - -
- -

"Concepts"

-

- -

-
    -
  • The purest form of OO is prototypes
  • - -
      -
    • prototype OO can implement class OO
    • -
-continued... - -
- - - - -
- -

"Concepts"

-

- -

-
    -
  • The purest form of OO is prototypes
  • - -
      -
    • prototype OO can implement class OO
    • -
    -
  • Concepts are new ways to express objects
  • -
-continued... - -
- - - - -
- -

"Concepts"

-

- -

-
    -
  • The purest form of OO is prototypes
  • - -
      -
    • prototype OO can implement class OO
    • -
    -
  • Concepts are new ways to express objects
  • -
  • A class is a concept
  • -
-continued... - -
- - - - -
- -

"Concepts"

-

- -

-
    -
  • The purest form of OO is prototypes
  • - -
      -
    • prototype OO can implement class OO
    • -
    -
  • Concepts are new ways to express objects
  • -
  • A class is a concept
  • -
  • A role is a concept
  • -
- -
- - - - -
- -

"Responder Interfaces"

-

- -

-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
  • Abstract VTable
  • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
  • Abstract VTable
  • - -
      -
    • The flattened method hierarchy
    • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
  • Abstract VTable
  • - -
      -
    • The flattened method hierarchy
    • -
    • ... or something completely different
    • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
  • Abstract VTable
  • - -
      -
    • The flattened method hierarchy
    • -
    • ... or something completely different
    • -
    • Performance
    • -
-continued... - -
- - - - -
- -

"Responder Interfaces"

-

- -

-
    -
  • $ri->dispatch( $responder, $invocation )
  • -
  • Generated from concepts
  • -
  • Abstract VTable
  • - -
      -
    • The flattened method hierarchy
    • -
    • ... or something completely different
    • -
    • Performance
    • -
    • Flexibility
    • -
- -
- - - - -
- -

"Responders"

-

- -

-continued... - -
- - - - -
- -

"Responders"

-

- -

-
    -
  • Something that is the subject of invocations
  • -
-continued... - -
- - - - -
- -

"Responders"

-

- -

-
    -
  • Something that is the subject of invocations
  • - -
      -
    • An object instance
    • -
-continued... - -
- - - - -
- -

"Responders"

-

- -

-
    -
  • Something that is the subject of invocations
  • - -
      -
    • An object instance
    • -
    • A class (class methods)
    • -
-continued... - -
- - - - -
- -

"Responders"

-

- -

-
    -
  • Something that is the subject of invocations
  • - -
      -
    • An object instance
    • -
    • A class (class methods)
    • -
    -
  • A simple tuple ( $data, $ri )
  • -
- -
- - - - -
- -

"Invocations"

-

- -

-continued... - -
- - - - -
- -

"Invocations"

-

- -

-
    -
  • A method call, multimethod, message... whatever
  • -
-continued... - -
- - - - -
- -

"Invocations"

-

- -

-
    -
  • A method call, multimethod, message... whatever
  • - -
      -
    • Arguments, too
    • -
-continued... - -
- - - - -
- -

"Invocations"

-

- -

-
    -
  • A method call, multimethod, message... whatever
  • - -
      -
    • Arguments, too
    • -
    -
  • Whatever an RI will put up with
  • -
-continued... - -
- - - - -
- -

"Invocations"

-

- -

-
    -
  • A method call, multimethod, message... whatever
  • - -
      -
    • Arguments, too
    • -
    -
  • Whatever an RI will put up with
  • - -
      -
    • Extensible calling semantics
    • -
- -
- - - - -
- -

MO compilation flow

-

- -

-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
    • ... and ancestor classes & roles
    • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
    • ... and ancestor classes & roles
    • -
    -
  • Compile class
  • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
    • ... and ancestor classes & roles
    • -
    -
  • Compile class
  • - -
      -
    • my $class_methods_ri = $class->class_interface()
    • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
    • ... and ancestor classes & roles
    • -
    -
  • Compile class
  • - -
      -
    • my $class_methods_ri = $class->class_interface()
    • -
    • Instance method RI closed in the constructor, within $ri
    • -
-continued... - -
- - - - -
- -

MO compilation flow

-

- -

-
    -
  • Instantiate a Class object
  • - -
      -
    • Specify members (methods, attributes)
    • -
    • ... and ancestor classes & roles
    • -
    -
  • Compile class
  • - -
      -
    • my $class_methods_ri = $class->class_interface()
    • -
    • Instance method RI closed in the constructor, within $ri
    • -
    • Purely functional operation
    • -
- -
- - - - -
- -

RI composition

-

- -

-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
  • Compute instance slots from attributes
  • -
-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
  • Compute instance slots from attributes
  • -
  • Generate accessors
  • -
-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
  • Compute instance slots from attributes
  • -
  • Generate accessors
  • -
-
  MO::Run::ResponderInterface::MethodTable->new(
-    methods => %methods
-  );
-
-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
  • Compute instance slots from attributes
  • -
  • Generate accessors
  • -
-
  MO::Run::ResponderInterface::MethodTable->new(
-    methods => %methods
-  );
-
-
    -
  • Generate constructor
  • -
-continued... - -
- - - - -
- -

RI composition

-

- -

-
    -
  • Compute instance methods and attributes from ancestry
  • -
  • Compute instance slots from attributes
  • -
  • Generate accessors
  • -
-
  MO::Run::ResponderInterface::MethodTable->new(
-    methods => %methods
-  );
-
-
    -
  • Generate constructor
  • -
-
  sub {
-    my $data = process_params(@_);
-    return box( $data, $instance_ri );
-  }
-
- -
- - - - -
- -

Instantiation

-

- -

-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
  • Compose data from params
  • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
  • Compose data from params
  • - -
      -
    • Slightly complicated
    • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
  • Compose data from params
  • - -
      -
    • Slightly complicated
    • -
    -
  • Link data with closed $instance_ri
  • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
  • Compose data from params
  • - -
      -
    • Slightly complicated
    • -
    -
  • Link data with closed $instance_ri
  • - -
      -
    • Responder == ( Data, RI )
    • -
-continued... - -
- - - - -
- -

Instantiation

-

- -

-
    -
  • Lookup RI using class name
  • -
  • Dispatch constructor class method
  • -
  • Compose data from params
  • - -
      -
    • Slightly complicated
    • -
    -
  • Link data with closed $instance_ri
  • - -
      -
    • Responder == ( Data, RI )
    • -
    • Like bless
    • -
- -
- - - - -
- -

Method calls

-

- -

-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-
  my $ri = $responder->responder_interface;
-
-
-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-
  my $ri = $responder->responder_interface;
-
-
-  my $method = MO::Run::Invocation::Method->new(
-    name      => "foo"
-    arguments => \@blah,
-  );
-
-
-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-
  my $ri = $responder->responder_interface;
-
-
-  my $method = MO::Run::Invocation::Method->new(
-    name      => "foo"
-    arguments => \@blah,
-  );
-
-
-  $ri->dispatch( $responder, $method );
-
-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-
  my $ri = $responder->responder_interface;
-
-
-  my $method = MO::Run::Invocation::Method->new(
-    name      => "foo"
-    arguments => \@blah,
-  );
-
-
-  $ri->dispatch( $responder, $method );
-
-
    -
  • Arbitrary responder interfaces also allowed
  • -
-continued... - -
- - - - -
- -

Method calls

-

- -

-
    -
  • How to talk with your new object?
  • -
-
  my $ri = $responder->responder_interface;
-
-
-  my $method = MO::Run::Invocation::Method->new(
-    name      => "foo"
-    arguments => \@blah,
-  );
-
-
-  $ri->dispatch( $responder, $method );
-
-
    -
  • Arbitrary responder interfaces also allowed
  • - -
      -
    • Doesn't have to be $responder->responder_interface
    • -
- -
- - - - -
- -

OH NOES!!!

-

- -

-continued... - -
- - - - -
- -

OH NOES!!!

-

- -

-
    -
  • What's wrong with the previous slide?
  • -
-continued... - -
- - - - -
- -

OH NOES!!!

-

- -

-
    -
  • What's wrong with the previous slide?
  • -
  • RIs are objects too!
  • -
-continued... - -
- - - - -
- -

OH NOES!!!

-

- -

-
    -
  • What's wrong with the previous slide?
  • -
  • RIs are objects too!
  • -
  • Need to bootstrap method calls
  • -
-continued... - -
- - - - -
- -

OH NOES!!!

-

- -

-
    -
  • What's wrong with the previous slide?
  • -
  • RIs are objects too!
  • -
  • Need to bootstrap method calls
  • -
  • Runtime must bootstrap low level OO
  • -
-continued... - -
- - - - -
- -

OH NOES!!!

-

- -

-
    -
  • What's wrong with the previous slide?
  • -
  • RIs are objects too!
  • -
  • Need to bootstrap method calls
  • -
  • Runtime must bootstrap low level OO
  • - -
      -
    • More on this soon
    • -
- -
- - - - -
- -

Meta level polymorphism

-

- -

-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
    -
  • Easy to specialize
  • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
    -
  • Easy to specialize
  • - -
      -
    • Optimizations
    • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
    -
  • Easy to specialize
  • - -
      -
    • Optimizations
    • -
    • Strange features
    • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
    -
  • Easy to specialize
  • - -
      -
    • Optimizations
    • -
    • Strange features
    • -
    -
  • Easy to mix several OO systems
  • -
-continued... - -
- - - - -
- -

Meta level polymorphism

-

- -

-
    -
  • An important point
  • - -
      -
    • In fact, the point of MO
    • -
    -
  • Responder interfaces are polymorphic
  • - -
      -
    • Method table, network proxy, whatever
    • -
    -
  • Easy to specialize
  • - -
      -
    • Optimizations
    • -
    • Strange features
    • -
    -
  • Easy to mix several OO systems
  • - -
      -
    • Just compile to separate RIs
    • -
- -
- - - - -
- -

MO in Perl 5

-

- -

-continued... - -
- - - - -
- -

MO in Perl 5

-

- -

-
    -
  • Two runtimes
  • -
-continued... - -
- - - - -
- -

MO in Perl 5

-

- -

-
    -
  • Two runtimes
  • -
  • Very different
  • -
-continued... - -
- - - - -
- -

MO in Perl 5

-

- -

-
    -
  • Two runtimes
  • -
  • Very different
  • -
  • MO::Run::Aux wraps both
  • -
-continued... - -
- - - - -
- -

MO in Perl 5

-

- -

-
    -
  • Two runtimes
  • -
  • Very different
  • -
  • MO::Run::Aux wraps both
  • - -
      -
    • Share tests by running with different %ENV var
    • -
- -
- - - - -
- -

Hosted runtime

-

- -

-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
    • Completely separate levels
    • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
    • Completely separate levels
    • -
    -
  • $ri->dispatch( $responder, $method )
  • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
    • Completely separate levels
    • -
    -
  • $ri->dispatch( $responder, $method )
  • - -
      -
    • not $responder->$method()
    • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
    • Completely separate levels
    • -
    -
  • $ri->dispatch( $responder, $method )
  • - -
      -
    • not $responder->$method()
    • -
    -
  • Full expressiveness
  • -
-continued... - -
- - - - -
- -

Hosted runtime

-

- -

-
    -
  • Nested object system
  • -
  • Bootstraps with Perl 5
  • - -
      -
    • Native Perl OO == Low level, like VM opcodes
    • -
    • Virtualized MO == High Level
    • -
    • Completely separate levels
    • -
    -
  • $ri->dispatch( $responder, $method )
  • - -
      -
    • not $responder->$method()
    • -
    -
  • Full expressiveness
  • -
  • Slow, verbose
  • -
- -
- - - - -
- -

Native runtime

-

- -

-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
    -
  • Only named method calls
  • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
    -
  • Only named method calls
  • - -
      -
    • No arbitrary call concepts
    • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
    -
  • Only named method calls
  • - -
      -
    • No arbitrary call concepts
    • -
    • -> doesn't support anything else
    • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
    -
  • Only named method calls
  • - -
      -
    • No arbitrary call concepts
    • -
    • -> doesn't support anything else
    • -
    -
  • As fast as "regular" Perl OO
  • -
-continued... - -
- - - - -
- -

Native runtime

-

- -

-
    -
  • Integrated object system
  • -
  • RIs are compiled into packages
  • - -
      -
    • Simple RIs are dissassembled and stuffed into the stash
    • -
    • Complex RIs use AUTOLOAD, delegating to the RI meta object
    • -
    -
  • Only named method calls
  • - -
      -
    • No arbitrary call concepts
    • -
    • -> doesn't support anything else
    • -
    -
  • As fast as "regular" Perl OO
  • - -
      -
    • Even makes simple, standalone `.pmc`s
    • -
- -
- - - - -
- -

Perl 5 Runtimes

-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
    • Lacks arbitrary invocations
    • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
    • Lacks arbitrary invocations
    • -
    -
  • Virtualized
  • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
    • Lacks arbitrary invocations
    • -
    -
  • Virtualized
  • - -
      -
    • Feature complete
    • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
    • Lacks arbitrary invocations
    • -
    -
  • Virtualized
  • - -
      -
    • Feature complete
    • -
    • Doesn't integrate
    • -
-continued... - -
- - - - -
- -

Perl 5 Runtimes

-
    -
  • Native
  • - -
      -
    • Usable with regular Perl OO
    • -
    • Lacks arbitrary invocations
    • -
    -
  • Virtualized
  • - -
      -
    • Feature complete
    • -
    • Doesn't integrate
    • -
    • Slow
    • -
- -
- - - - -
- -

Idealized MO toolchain

-

- -

-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
    -
  • VM Opcodes support standard RI
  • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
    -
  • VM Opcodes support standard RI
  • -
  • Custom RIs are just objects
  • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
    -
  • VM Opcodes support standard RI
  • -
  • Custom RIs are just objects
  • - -
      -
    • Bootstrapped using standard runtime objects
    • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
    -
  • VM Opcodes support standard RI
  • -
  • Custom RIs are just objects
  • - -
      -
    • Bootstrapped using standard runtime objects
    • - -
        -
      • Method table RI
      • -
-continued... - -
- - - - -
- -

Idealized MO toolchain

-

- -

-
    -
  • Compiler handles modeling
  • - -
      -
    • Constructs meta objects at compile time
    • -
    -
  • VM Opcodes support standard RI
  • -
  • Custom RIs are just objects
  • - -
      -
    • Bootstrapped using standard runtime objects
    • - -
        -
      • Method table RI
      • -
      • Named method invocation
      • -
- -
- - - - -
- -

Perl 6

-

- -

-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
      • Concept declarations
      • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
      • Concept declarations
      • -
      -
    • Implement bootstrap RIs in VM opcodes
    • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
      • Concept declarations
      • -
      -
    • Implement bootstrap RIs in VM opcodes
    • -
    -
  • Pugs might be using MO
  • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
      • Concept declarations
      • -
      -
    • Implement bootstrap RIs in VM opcodes
    • -
    -
  • Pugs might be using MO
  • - -
      -
    • I'm not really sure
    • -
-continued... - -
- - - - -
- -

Perl 6

-

- -

-
    -
  • Perl 6 is the idealized MO toolchain
  • - -
      -
    • Can introduce syntax
    • - -
        -
      • Invocation types
      • -
      • Concept declarations
      • -
      -
    • Implement bootstrap RIs in VM opcodes
    • -
    -
  • Pugs might be using MO
  • - -
      -
    • I'm not really sure
    • -
    • It was ported a while ago
    • -
- -
- - - - -
- -

Introducing new concepts

-continued... - -
- - - - -
- -

Introducing new concepts

-
    -
  • Roles are the shit
  • -
-continued... - -
- - - - -
- -

Introducing new concepts

-
    -
  • Roles are the shit
  • -
  • But what about next week's fad?
  • -
-continued... - -
- - - - -
- -

Introducing new concepts

-
    -
  • Roles are the shit
  • -
  • But what about next week's fad?
  • -
  • MO lets you introduce a new concept
  • -
-continued... - -
- - - - -
- -

Introducing new concepts

-
    -
  • Roles are the shit
  • -
  • But what about next week's fad?
  • -
  • MO lets you introduce a new concept
  • - -
      -
    • Arbitrary at compile time
    • -
-continued... - -
- - - - -
- -

Introducing new concepts

-
    -
  • Roles are the shit
  • -
  • But what about next week's fad?
  • -
  • MO lets you introduce a new concept
  • - -
      -
    • Arbitrary at compile time
    • -
    • RI protocol at runtime
    • -
- -
- - - - -
- -

Example - Prototype Objects

-continued... - -
- - - - -
- -

Example - Prototype Objects

-
    -
  • One shared RI
  • -
-
  sub dispatch {
-    my ( $object, $invocation ) = @_;
-
-    my $method = $object->{ $invocation->name };
-
-    $object->$method( $invocation->arguments );
-  }
-
- -
- - - - -
- -

Example - Attribute Grammars

-

- -

-continued... - -
- - - - -
- -

Example - Attribute Grammars

-

- -

-
    -
  • Crazy stuff from the 1970s
  • -
-continued... - -
- - - - -
- -

Example - Attribute Grammars

-

- -

-
    -
  • Crazy stuff from the 1970s
  • -
  • Renewed interest in λ land
  • -
-continued... - -
- - - - -
- -

Example - Attribute Grammars

-

- -

-
    -
  • Crazy stuff from the 1970s
  • -
  • Renewed interest in λ land
  • -
  • Was pretty easy in MO
  • -
- -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • -
-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • - -
      -
    • Attribute Grammar
    • -
-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • - -
      -
    • Attribute Grammar
    • -
    • Attribute Grammer Instance - one per AG per class
    • -
-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • - -
      -
    • Attribute Grammar
    • -
    • Attribute Grammer Instance - one per AG per class
    • -
    -
  • Runtime specialized RI
  • -
-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • - -
      -
    • Attribute Grammar
    • -
    • Attribute Grammer Instance - one per AG per class
    • -
    -
  • Runtime specialized RI
  • - -
      -
    • Shadows any RI with additional context sensitive methods
    • -
-continued... - -
- - - - -
- -

Attribute Grammer Implementation

-

- -

-
    -
  • Introduce new concept objects
  • - -
      -
    • Attribute Grammar
    • -
    • Attribute Grammer Instance - one per AG per class
    • -
    -
  • Runtime specialized RI
  • - -
      -
    • Shadows any RI with additional context sensitive methods
    • -
    -
  • Additional runtime support code
  • -
- -
- - - - -
- -

MO TODO

-

- -

-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
    -
  • Tests
  • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
    -
  • Tests
  • -
  • Refactor the Class objects
  • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
    -
  • Tests
  • -
  • Refactor the Class objects
  • - -
      -
    • Bloated example code
    • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
    -
  • Tests
  • -
  • Refactor the Class objects
  • - -
      -
    • Bloated example code
    • -
    • There are some patterns to extract
    • -
-continued... - -
- - - - -
- -

MO TODO

-

- -

-
    -
  • Write a sugar layer
  • - -
      -
    • Make it fun to use
    • -
    -
  • Tests
  • -
  • Refactor the Class objects
  • - -
      -
    • Bloated example code
    • -
    • There are some patterns to extract
    • -
    -
  • Self hosting
  • -
- -
- - - - -
- -

Self Hosting

-continued... - -
- - - - -
- -

Self Hosting

-
    -
  • Easier to maintain MO written in Moose
  • -
-continued... - -
- - - - -
- -

Self Hosting

-
    -
  • Easier to maintain MO written in Moose
  • -
  • Need to have clean syntax
  • -
-continued... - -
- - - - -
- -

Self Hosting

-
    -
  • Easier to maintain MO written in Moose
  • -
  • Need to have clean syntax
  • -
  • Stable .pmc compilation
  • -
- -
- - - - -
- -

Conclusion

-

- -

-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Especially my meta code ;-)
    • -
- -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • - -
      -
    • It can affect anything
    • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • - -
      -
    • It can affect anything
    • -
    • Keep it minimalistic, and clearly defined
    • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • - -
      -
    • It can affect anything
    • -
    • Keep it minimalistic, and clearly defined
    • -
    • No spaghetti monsters
    • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • - -
      -
    • It can affect anything
    • -
    • Keep it minimalistic, and clearly defined
    • -
    • No spaghetti monsters
    • -
    -
  • Meta code can be simple
  • -
-continued... - -
- - - - -
- -

Conclusion

-

- -

-
    -
  • Meta code is awesome code
  • - -
      -
    • Lets you program in new ways
    • -
    • Helps you take care of your other code
    • -
    -
  • Meta code is important code
  • - -
      -
    • It can affect anything
    • -
    • Keep it minimalistic, and clearly defined
    • -
    • No spaghetti monsters
    • -
    -
  • Meta code can be simple
  • - -
      -
    • Only complicated if you aren't careful
    • -
- -
- - - - -
- -

BIE FRENDS

-

- -

- -
- - - - - - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/s5.html b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/s5.html deleted file mode 100644 index 0e03162..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/s5.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - -[% presentation_topic %] - - - - - - - - - - - -
-
- - -
- -
-

[% presentation_title %]

-

[% presentation_place %]

-

[% presentation_date %]

-
- -[% FOREACH s = slides %] -[% s %] -[% END %] - - - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/slide.html b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/slide.html deleted file mode 100644 index aa20d02..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/template/s5/slide.html +++ /dev/null @@ -1,9 +0,0 @@ - -
-[% image_html %] -[% slide_content %] -[%- UNLESS last -%] -continued... -[% END %] -
- diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-shade.png b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-shade.png deleted file mode 100644 index 172c914..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-shade.png and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-slide.jpg b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-slide.jpg deleted file mode 100644 index 6be0296..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bg-slide.jpg and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/blank.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/blank.gif deleted file mode 100644 index 75b945d..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/blank.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bodybg.gif b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bodybg.gif deleted file mode 100644 index 5f448a1..0000000 Binary files a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/bodybg.gif and /dev/null differ diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/framing.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/framing.css deleted file mode 100644 index 0fc59a5..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/framing.css +++ /dev/null @@ -1,24 +0,0 @@ -/* The following styles size and place the slide components. - Edit them if you want to change the overall slide layout. - The commented lines can be uncommented (and modified, if necessary) - to help you with the rearrangement process. */ - -div#header, div#footer, div.slide {width: 100%; top: 0; left: 0;} -div#header {top: 0; left: 0; z-index: 1;} -div#footer {top: auto; bottom: 0; width: 100%; z-index: 5;} -div.slide {top: 0; width: 88%; padding: 1em 7% 2em 5%; z-index: 2;} - -div#controls {bottom: 1em; left: 0; width: 100%; text-align: center; z-index: 1000;} -div#controls form {margin: 0; padding: 0;} - -#currentSlide {position: absolute; left: 0; bottom: 0.5em; z-index: 10; - width: 100%; text-align: center;} -html>body #currentSlide {position: fixed;} - -/* -div#header {background: #FCC;} -div#footer {background: #CCF;} -div#controls {background: #BBD;} -div#currentSlide {background: #FFC;} -*/ - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/iepngfix.htc b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/iepngfix.htc deleted file mode 100644 index 1e9d213..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/iepngfix.htc +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/opera.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/opera.css deleted file mode 100644 index 24921ba..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/opera.css +++ /dev/null @@ -1,7 +0,0 @@ -/* DO NOT CHANGE THESE unless you really want to break Opera Show */ -div.slide { - visibility: visible !important; - position: static !important; - page-break-before: always; -} -#slide0 {page-break-before: avoid;} diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/outline.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/outline.css deleted file mode 100644 index 56cfb32..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/outline.css +++ /dev/null @@ -1,16 +0,0 @@ -/* don't change this unless you want the layout stuff to show up in the outline view! */ - -.layout div, #footer *, #controlForm * {display: none;} -#footer, #controls, #controlForm, #navLinks, #toggle { - display: block; visibility: visible; margin: 0; padding: 0;} -#toggle {float: right; padding: 0.5em;} -html>body #toggle {position: fixed; top: 0; right: 0;} - -/* making the outline look pretty-ish */ - -#slide0 h1, #slide0 h2, #slide0 h3, #slide0 h4 {border: none; margin: 0;} -#slide0 h1 {padding-top: 1.5em;} -.slide h1 {margin: 1.5em 0 0; padding-top: 0.25em; - border-top: 1px solid #888; border-bottom: 1px solid #AAA;} -#toggle {border: 1px solid; border-width: 0 0 1px 1px; background: #FFF;} - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pngbehavior.htc b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pngbehavior.htc deleted file mode 100644 index 882e925..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pngbehavior.htc +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pretty.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pretty.css deleted file mode 100644 index f3d1585..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/pretty.css +++ /dev/null @@ -1,48 +0,0 @@ -/* - Theme: i18n - Eric A. Meyer (http://meyerweb.com/) - Theme placed under CC by-sa 2.0 license -*/ - -body {background: #95A7D4 url(bg-slide.jpg) 100% 100% no-repeat; color: #210; font: 36px Arial, sans-serif; line-height: .9;} -a {text-decoration: none; color: #336; border-bottom: 1px dotted;} -h1, h2, h3, h4, h5, h6 {font-size: 1.5em; margin: 0;} -sup {font-size: 0.75em; font-weight: normal; - vertical-align: 0.5em; line-height: 1px;} -ul {margin-left: 1em; padding-left: 0; font-size: } -li {margin-bottom: 0.66em;} -li li {margin: 0.33em 0; font-size: smaller;} - -#header {background: url(bg-shade.png); border-bottom: 1px solid #333; - padding-bottom: 2em;} -#footer {background: url(bg-shade.png); color: #BBB; border-top: 1px solid #333;} -#header, #footer {font-size: 0.5em;} -#footer h1, #footer h2 { padding: 0.5em 0.75em; - font-weight: normal; font-style: italic;} -#footer h1 {left: 0; font-size: 1em; letter-spacing: 1px;} -#footer h2 {position: absolute; bottom: 0; right: 0;} - -#controls {font-size: 0.75em;} -#navList {margin-top: 3px;} -#navLinks a {margin: 0 0.33em; padding: 0 0.25em; - border: 1px solid; border-color: #CCD #556 #556 #CCD; - background-color: #8597C4;} - -#currentSlide {font-size: 0.5em;} -#currentSlide span {font-size: 13px; color: rgb(49%,47%,66%);} -#currentSlide #csSep {display: none;} -#currentSlide #csHere {font-weight: bold;} -#currentSlide #csHere:before {content: "#"; font-weight: normal;} -#currentSlide #csTotal:before {content: " of ";} - -.slide h1 {font-size: 2em; line-height: 1; letter-spacing: -1px; font-weight: +100%; - margin: 0 -15% 1em 0; padding: 0.5em 15% 0.06125em 0; border-bottom: 0.06125em solid rgb(90,94,120);} -#slide0 h1 {border: none; font-size: 2em; letter-spacing: 0; margin: 3em 0 1.5em;} -#slide0 h2 {font-size: 1em; margin: 0.5em 0 0;} -#slide0 h3 {font-size: 1em; margin: 0.5em 0 0;} -#slide0 h4 {margin-top: 0; font-size: smaller;} - -small { display: none }; - -.slide .current {color: #003; text-shadow: 0 0 0.25em #9AABD7;} - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/print.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/print.css deleted file mode 100644 index 027bedf..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/print.css +++ /dev/null @@ -1,23 +0,0 @@ -/* The next rule is necessary to have all slides appear in print! DO NOT REMOVE IT! */ -div.slide, ul {page-break-inside: avoid; visibility: visible !important;} -h1 {page-break-after: avoid;} - -body {font-size: 12pt; background: white;} -* {color: black;} - -#slide0 h1 {font-size: 200%; border: none; margin: 0.5em 0 0.25em;} -#slide0 h3 {margin: 0; padding: 0;} -#slide0 h4 {margin: 0 0 0.5em; padding: 0;} -#slide0 {margin-bottom: 3em;} - -h1 {border-top: 2pt solid gray; border-bottom: 1px dotted silver;} -.extra {background: transparent !important;} -div.extra, pre.extra, .example {font-size: 10pt; color: #333;} -ul.extra a {font-weight: bold;} -p.example {display: none;} - -#header {display: none;} -#footer h1 {margin: 0; border-bottom: 1px solid; color: gray; font-style: italic;} -#footer h2, #controls {display: none;} - -#currentSlide {display: none;} diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/s5-core.css b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/s5-core.css deleted file mode 100644 index bf254b8..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/s5-core.css +++ /dev/null @@ -1,10 +0,0 @@ -/* Do not edit or override these styles! The system will likely break if you do. */ - -div#header, div#footer, div#controls, div.slide {position: absolute;} -html>body div#header, html>body div#footer, - html>body div#controls, html>body div.slide {position: fixed;} -.handout {display: none;} -.layout {display: block;} -div.slide, .hideme, .incremental {visibility: hidden;} -#slide0 {visibility: visible;} - diff --git a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/slides-cc.js b/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/slides-cc.js deleted file mode 100644 index 16696a6..0000000 --- a/hosted-presentations/2007/nothingmuch-YAPC-EU/slides/ui/slides-cc.js +++ /dev/null @@ -1,587 +0,0 @@ -// S5 v1.1 slides.js -- released under CC by-sa 2.0 license -// -// Please see http://www.meyerweb.com/eric/tools/s5/credits.html for information -// about all the wonderful and talented contributors to this code! - -var undef; -var snum = 0; -var smax = 1; -var incpos = 0; -var number = undef; -var s5mode = true; -var slideCSS = document.getElementById('slideProj').href; -var defaultView = 'slideshow'; -var controlVis = 'visible'; - -var isIE = navigator.appName == 'Microsoft Internet Explorer' ? 1 : 0; -var isOp = navigator.userAgent.indexOf('Opera') > -1 ? 1 : 0; -var isGe = navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('Safari') < 1 ? 1 : 0; - -function hasClass(object, className) { - if (!object.className) return false; - return (object.className.search('(^|\\s)' + className + '(\\s|$)') != -1); -} - -function hasValue(object, value) { - if (!object) return false; - return (object.search('(^|\\s)' + value + '(\\s|$)') != -1); -} - -function removeClass(object,className) { - if (!object) return; - object.className = object.className.replace(new RegExp('(^|\\s)'+className+'(\\s|$)'), RegExp.$1+RegExp.$2); -} - -function addClass(object,className) { - if (!object || hasClass(object, className)) return; - if (object.className) { - object.className += ' '+className; - } else { - object.className = className; - } -} - -function GetElementsWithClassName(elementName,className) { - var allElements = document.getElementsByTagName(elementName); - var elemColl = new Array(); - for (var i = 0; i< allElements.length; i++) { - if (hasClass(allElements[i], className)) { - elemColl[elemColl.length] = allElements[i]; - } - } - return elemColl; -} - -function isParentOrSelf(element, id) { - if (element == null || element.nodeName=='BODY') return false; - else if (element.id == id) return true; - else return isParentOrSelf(element.parentNode, id); -} - -function nodeValue(node) { - var result = ""; - if (node.nodeType == 1) { - var children = node.childNodes; - for (var i = 0; i < children.length; ++i) { - result += nodeValue(children[i]); - } - } - else if (node.nodeType == 3) { - result = node.nodeValue; - } - return(result); -} - -function slideLabel() { - var slideColl = GetElementsWithClassName('*','slide'); - var list = document.getElementById('jumplist'); - smax = slideColl.length; - for (var n = 0; n < smax; n++) { - var obj = slideColl[n]; - - var did = 'slide' + n.toString(); - obj.setAttribute('id',did); - if (isOp) continue; - - var otext = ''; - var menu = obj.firstChild; - if (!menu) continue; // to cope with empty slides - while (menu && menu.nodeType == 3) { - menu = menu.nextSibling; - } - if (!menu) continue; // to cope with slides with only text nodes - - var menunodes = menu.childNodes; - for (var o = 0; o < menunodes.length; o++) { - otext += nodeValue(menunodes[o]); - } - list.options[list.length] = new Option(n + ' : ' + otext, n); - } -} - -function currentSlide() { - var cs; - if (document.getElementById) { - cs = document.getElementById('currentSlide'); - } else { - cs = document.currentSlide; - } - cs.innerHTML = '' + snum + '<\/span> ' + - '\/<\/span> ' + - '' + (smax-1) + '<\/span>'; - if (snum == 0) { - cs.style.visibility = 'hidden'; - } else { - cs.style.visibility = 'visible'; - } -} - -function go(step) { - if (document.getElementById('slideProj').disabled || step == 0) return; - var jl = document.getElementById('jumplist'); - var cid = 'slide' + snum; - var ce = document.getElementById(cid); - if (incrementals[snum].length > 0) { - for (var i = 0; i < incrementals[snum].length; i++) { - removeClass(incrementals[snum][i], 'current'); - removeClass(incrementals[snum][i], 'incremental'); - } - } - if (step != 'j') { - snum += step; - lmax = smax - 1; - if (snum > lmax) snum = lmax; - if (snum < 0) snum = 0; - } else - snum = parseInt(jl.value); - var nid = 'slide' + snum; - var ne = document.getElementById(nid); - if (!ne) { - ne = document.getElementById('slide0'); - snum = 0; - } - if (step < 0) {incpos = incrementals[snum].length} else {incpos = 0;} - if (incrementals[snum].length > 0 && incpos == 0) { - for (var i = 0; i < incrementals[snum].length; i++) { - if (hasClass(incrementals[snum][i], 'current')) - incpos = i + 1; - else - addClass(incrementals[snum][i], 'incremental'); - } - } - if (incrementals[snum].length > 0 && incpos > 0) - addClass(incrementals[snum][incpos - 1], 'current'); - ce.style.visibility = 'hidden'; - ne.style.visibility = 'visible'; - jl.selectedIndex = snum; - currentSlide(); - number = 0; -} - -function goTo(target) { - if (target >= smax || target == snum) return; - go(target - snum); -} - -function subgo(step) { - if (step > 0) { - removeClass(incrementals[snum][incpos - 1],'current'); - removeClass(incrementals[snum][incpos], 'incremental'); - addClass(incrementals[snum][incpos],'current'); - incpos++; - } else { - incpos--; - removeClass(incrementals[snum][incpos],'current'); - addClass(incrementals[snum][incpos], 'incremental'); - addClass(incrementals[snum][incpos - 1],'current'); - } -} - -function toggle() { - var slideColl = GetElementsWithClassName('div','slide'); - var slides = document.getElementById('slideProj'); - var outline = document.getElementById('outlineStyle'); - if (!slides.disabled) { - slides.disabled = true; - outline.disabled = false; - s5mode = false; - fontSize('1em'); - for (var n = 0; n < smax; n++) { - var slide = slideColl[n]; - slide.style.visibility = 'visible'; - } - } else { - slides.disabled = false; - outline.disabled = true; - s5mode = true; - fontScale(); - for (var n = 0; n < smax; n++) { - var slide = slideColl[n]; - slide.style.visibility = 'hidden'; - } - slideColl[snum].style.visibility = 'visible'; - } -} - -function showHide(action) { - var obj = GetElementsWithClassName('*','hideme')[0]; - switch (action) { - case 's': obj.style.visibility = 'visible'; break; - case 'h': obj.style.visibility = 'hidden'; break; - case 'k': - if (obj.style.visibility != 'visible') { - obj.style.visibility = 'visible'; - } else { - obj.style.visibility = 'hidden'; - } - break; - } -} - -// 'keys' code adapted from MozPoint (http://mozpoint.mozdev.org/) -function keys(key) { - if (!key) { - key = event; - key.which = key.keyCode; - } - if (key.which == 84) { - toggle(); - return; - } - if (s5mode) { - switch (key.which) { - case 10: // return - case 13: // enter - if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; - if (key.target && isParentOrSelf(key.target, 'controls')) return; - if(number != undef) { - goTo(number); - break; - } - case 32: // spacebar - case 34: // page down - case 39: // rightkey - case 40: // downkey - if(number != undef) { - go(number); - } else if (!incrementals[snum] || incpos >= incrementals[snum].length) { - go(1); - } else { - subgo(1); - } - break; - case 33: // page up - case 37: // leftkey - case 38: // upkey - if(number != undef) { - go(-1 * number); - } else if (!incrementals[snum] || incpos <= 0) { - go(-1); - } else { - subgo(-1); - } - break; - case 67: // c - showHide('k'); - break; - } - if (key.which < 48 || key.which > 57) { - number = undef; - } else { - if (window.event && isParentOrSelf(window.event.srcElement, 'controls')) return; - if (key.target && isParentOrSelf(key.target, 'controls')) return; - number = (((number != undef) ? number : 0) * 10) + (key.which - 48); - } - } -} - -function clicker(e) { - number = undef; - var target; - if (window.event) { - target = window.event.srcElement; - e = window.event; - } else target = e.target; - if (target.getAttribute('href') != null || hasValue(target.rel, 'external') || isParentOrSelf(target, 'controls') || isParentOrSelf(target,'embed') || isParentOrSelf(target,'object')) return true; - if (!e.which || e.which == 1) { - if (!incrementals[snum] || incpos >= incrementals[snum].length) { - go(1); - } else { - subgo(1); - } - } -} - -function findSlide(hash) { - var target = null; - var slides = GetElementsWithClassName('*','slide'); - for (var i = 0; i < slides.length; i++) { - var targetSlide = slides[i]; - if ( (targetSlide.name && targetSlide.name == hash) - || (targetSlide.id && targetSlide.id == hash) ) { - target = targetSlide; - break; - } - } - while(target != null && target.nodeName != 'BODY') { - if (hasClass(target, 'slide')) { - return parseInt(target.id.slice(5)); - } - target = target.parentNode; - } - return null; -} - -function slideJump() { - if (window.location.hash == null) return; - var sregex = /^#slide(\d+)$/; - var matches = sregex.exec(window.location.hash); - var dest = null; - if (matches != null) { - dest = parseInt(matches[1]); - } else { - dest = findSlide(window.location.hash.slice(1)); - } - if (dest != null) - go(dest - snum); -} - -function fixLinks() { - var thisUri = window.location.href; - thisUri = thisUri.slice(0, thisUri.length - window.location.hash.length); - var aelements = document.getElementsByTagName('A'); - for (var i = 0; i < aelements.length; i++) { - var a = aelements[i].href; - var slideID = a.match('\#slide[0-9]{1,2}'); - if ((slideID) && (slideID[0].slice(0,1) == '#')) { - var dest = findSlide(slideID[0].slice(1)); - if (dest != null) { - if (aelements[i].addEventListener) { - aelements[i].addEventListener("click", new Function("e", - "if (document.getElementById('slideProj').disabled) return;" + - "go("+dest+" - snum); " + - "if (e.preventDefault) e.preventDefault();"), true); - } else if (aelements[i].attachEvent) { - aelements[i].attachEvent("onclick", new Function("", - "if (document.getElementById('slideProj').disabled) return;" + - "go("+dest+" - snum); " + - "event.returnValue = false;")); - } - } - } - } -} - -function externalLinks() { - if (!document.getElementsByTagName) return; - var anchors = document.getElementsByTagName('a'); - for (var i=0; i' + - '