Object Meta Programming

YAPC::EU::2007

Aug 29, 2007

HAI FRENDS

My name is Yuval

Meta Programming

Introduction

continued...

Introduction

continued...

Introduction

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

continued...

Many forms

Summary

continued...

Summary

Object Meta Programming

Object Meta Programming

continued...

Object Meta Programming

continued...

Object Meta Programming

Simple Examples

continued...

Simple Examples

continued...

Simple Examples

continued...

Simple Examples

continued...

Simple Examples

continued...

Simple Examples

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

Modeling OO

continued...

Modeling OO

  class Class {
    has @isa;
    has %methods;
    has %attributes;

    ...
  }

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

continued...

Modeling OO

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

continued...

Metamodel Services

continued...

Metamodel Services

continued...

Metamodel Services

continued...

Metamodel Services

continued...

Metamodel Services

Case Study

Moose

continued...

Case Study

Moose

continued...

Case Study

Moose

continued...

Case Study

Moose

continued...

Case Study

Moose

continued...

Case Study

Moose

continued...

Case Study

Moose

Perl's native OO

continued...

Perl's native OO

continued...

Perl's native OO

continued...

Perl's native OO

continued...

Perl's native OO

continued...

Perl's native OO

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

continued...

Class::MOP

Moose's custom metaclasses

continued...

Moose's custom metaclasses

continued...

Moose's custom metaclasses

continued...

Moose's custom metaclasses

continued...

Moose's custom metaclasses

continued...

Moose's custom metaclasses

Moose sugar layer

continued...

Moose sugar layer

continued...

Moose sugar layer

continued...

Moose sugar layer

  has foo => ( is => "rw" );
continued...

Moose sugar layer

  has foo => ( is => "rw" );
continued...

Moose sugar layer

  has foo => ( is => "rw" );
  $metaclass->add_attribute(
    Moose::Meta::Attribute->new(
      foo => ( is => "rw" ),
    )
  );

Moose vs. Class::Accessor

continued...

Moose vs. Class::Accessor

continued...

Moose vs. Class::Accessor

continued...

Moose vs. Class::Accessor

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

continued...

MooseX::

The point of Moose

continued...

The point of Moose

continued...

The point of Moose

continued...

The point of Moose

continued...

The point of Moose

continued...

The point of Moose

continued...

The point of Moose

Another Case Study

ORMs

continued...

Another Case Study

ORMs

continued...

Another Case Study

ORMs

ORMs

continued...

ORMs

continued...

ORMs

continued...

ORMs

continued...

ORMs

continued...

ORMs

continued...

ORMs

continued...

ORMs

Class::DBI

continued...

Class::DBI

continued...

Class::DBI

continued...

Class::DBI

continued...

Class::DBI

continued...

Class::DBI

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

continued...

DBIx::Class

ORM related meta programming

continued...

ORM related meta programming

continued...

ORM related meta programming

Vaporware

MO

continued...

MO

continued...

MO

continued...

MO

continued...

MO

MO Sucks

continued...

MO Sucks

continued...

MO Sucks

continued...

MO Sucks

continued...

MO Sucks

continued...

MO Sucks

MO Rocks

continued...

MO Rocks

continued...

MO Rocks

continued...

MO Rocks

continued...

MO Rocks

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

continued...

MO Architechture

"Concepts"

continued...

"Concepts"

continued...

"Concepts"

continued...

"Concepts"

continued...

"Concepts"

continued...

"Concepts"

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

continued...

"Responder Interfaces"

"Responders"

continued...

"Responders"

continued...

"Responders"

continued...

"Responders"

continued...

"Responders"

"Invocations"

continued...

"Invocations"

continued...

"Invocations"

continued...

"Invocations"

continued...

"Invocations"

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

continued...

MO compilation flow

RI composition

continued...

RI composition

continued...

RI composition

continued...

RI composition

continued...

RI composition

  MO::Run::ResponderInterface::MethodTable->new(
    methods => %methods
  );
continued...

RI composition

  MO::Run::ResponderInterface::MethodTable->new(
    methods => %methods
  );
continued...

RI composition

  MO::Run::ResponderInterface::MethodTable->new(
    methods => %methods
  );
  sub {
    my $data = process_params(@_);
    return box( $data, $instance_ri );
  }

Instantiation

continued...

Instantiation

continued...

Instantiation

continued...

Instantiation

continued...

Instantiation

continued...

Instantiation

continued...

Instantiation

continued...

Instantiation

Method calls

continued...

Method calls

continued...

Method calls

  my $ri = $responder->responder_interface;

continued...

Method calls

  my $ri = $responder->responder_interface;


  my $method = MO::Run::Invocation::Method->new(
    name      => "foo"
    arguments => \@blah,
  );

continued...

Method calls

  my $ri = $responder->responder_interface;


  my $method = MO::Run::Invocation::Method->new(
    name      => "foo"
    arguments => \@blah,
  );


  $ri->dispatch( $responder, $method );
continued...

Method calls

  my $ri = $responder->responder_interface;


  my $method = MO::Run::Invocation::Method->new(
    name      => "foo"
    arguments => \@blah,
  );


  $ri->dispatch( $responder, $method );
continued...

Method calls

  my $ri = $responder->responder_interface;


  my $method = MO::Run::Invocation::Method->new(
    name      => "foo"
    arguments => \@blah,
  );


  $ri->dispatch( $responder, $method );

OH NOES!!!

continued...

OH NOES!!!

continued...

OH NOES!!!

continued...

OH NOES!!!

continued...

OH NOES!!!

continued...

OH NOES!!!

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

continued...

Meta level polymorphism

MO in Perl 5

continued...

MO in Perl 5

continued...

MO in Perl 5

continued...

MO in Perl 5

continued...

MO in Perl 5

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

continued...

Hosted runtime

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

continued...

Native runtime

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

continued...

Perl 5 Runtimes

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

continued...

Idealized MO toolchain

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

continued...

Perl 6

Introducing new concepts

continued...

Introducing new concepts

continued...

Introducing new concepts

continued...

Introducing new concepts

continued...

Introducing new concepts

continued...

Introducing new concepts

Example - Prototype Objects

continued...

Example - Prototype Objects

  sub dispatch {
    my ( $object, $invocation ) = @_;

    my $method = $object->{ $invocation->name };

    $object->$method( $invocation->arguments );
  }

Example - Attribute Grammars

continued...

Example - Attribute Grammars

continued...

Example - Attribute Grammars

continued...

Example - Attribute Grammars

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

continued...

Attribute Grammer Implementation

MO TODO

continued...

MO TODO

continued...

MO TODO

continued...

MO TODO

continued...

MO TODO

continued...

MO TODO

continued...

MO TODO

continued...

MO TODO

Self Hosting

continued...

Self Hosting

continued...

Self Hosting

continued...

Self Hosting

Conclusion

continued...

Conclusion

continued...

Conclusion

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

continued...

Conclusion

BIE FRENDS